diff --git a/.classpath b/.classpath index 5830d28..57e97d1 100644 --- a/.classpath +++ b/.classpath @@ -1,12 +1,11 @@ - - - + + @@ -30,5 +29,6 @@ + diff --git a/KLALB软件说明书V3.4.docx b/KLALB软件说明书V3.4.docx new file mode 100644 index 0000000..ed5e478 Binary files /dev/null and b/KLALB软件说明书V3.4.docx differ diff --git a/hs_err_pid28220.log b/hs_err_pid28220.log new file mode 100644 index 0000000..37b03ef --- /dev/null +++ b/hs_err_pid28220.log @@ -0,0 +1,2420 @@ +# +# There is insufficient memory for the Java Runtime Environment to continue. +# Native memory allocation (mmap) failed to map 855638016 bytes. Error detail: G1 virtual space +# Possible reasons: +# The system is out of physical RAM or swap space +# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap +# Possible solutions: +# Reduce memory load on the system +# Increase physical memory or swap space +# Check if swap backing store is full +# Decrease Java heap size (-Xmx/-Xms) +# Decrease number of Java threads +# Decrease Java thread stack sizes (-Xss) +# Set larger code cache with -XX:ReservedCodeCacheSize= +# JVM is running with Zero Based Compressed Oops mode in which the Java heap is +# placed in the first 32GB address space. The Java Heap base address is the +# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress +# to set the Java Heap base and to place the Java Heap above 32GB virtual address. +# This output file may be truncated or incomplete. +# +# Out of Memory Error (os_windows.cpp:3703), pid=28220, tid=13556 +# +# JRE version: Java(TM) SE Runtime Environment Oracle GraalVM 23.0.1+11.1 (23.0.1+11) (build 23.0.1+11-jvmci-b01) +# Java VM: Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 23.0.1+11.1 (23.0.1+11-jvmci-b01, mixed mode, sharing, tiered, jvmci, jvmci compiler, compressed oops, compressed class ptrs, g1 gc, windows-amd64) +# Core dump will be written. Default location: C:\KNEļ\coding\java\KLALB\hs_err_pid28220.mdmp +# + +--------------- S U M M A R Y ------------ + +Command Line: -XX:ThreadPriorityPolicy=1 -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCIProduct -XX:-UnlockExperimentalVMOptions --add-exports=java.base/jdk.internal.misc=jdk.graal.compiler -XX:+ShowCodeDetailsInExceptionMessages --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED --add-exports=java.base/jdk.internal.foreign=ALL-UNNAMED --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED --add-opens=java.base/jdk.internal.foreign=ALL-UNNAMED org.kne.cloud.network.monitor.TimestampMonitor + +Host: Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz, 56 cores, 63G, Windows Server 2022 , 64 bit Build 20348 (10.0.20348.1726) +Time: Wed Oct 29 17:48:51 2025 Windows Server 2022 , 64 bit Build 20348 (10.0.20348.1726) elapsed time: 261.462283 seconds (0d 0h 4m 21s) + +--------------- T H R E A D --------------- + +Current thread (0x0000016c7e80d430): VMThread "VM Thread" [id=13556, stack(0x0000000f5c200000,0x0000000f5c300000) (1024K)] + +Stack: [0x0000000f5c200000,0x0000000f5c300000] +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +V [jvm.dll+0x6e08b9] (no source info available) +V [jvm.dll+0x87dc83] (no source info available) +V [jvm.dll+0x88010e] (no source info available) +V [jvm.dll+0x8807e3] (no source info available) +V [jvm.dll+0x27aee6] (no source info available) +V [jvm.dll+0x6dd1c5] (no source info available) +V [jvm.dll+0x6d104a] (no source info available) +V [jvm.dll+0x35b3ea] (no source info available) +V [jvm.dll+0x3637f6] (no source info available) +V [jvm.dll+0x34fd5e] (no source info available) +V [jvm.dll+0x34fff8] (no source info available) +V [jvm.dll+0x3289cc] (no source info available) +V [jvm.dll+0x328a5a] (no source info available) +V [jvm.dll+0x374c92] (no source info available) +V [jvm.dll+0x373392] (no source info available) +V [jvm.dll+0x3281a7] (no source info available) +V [jvm.dll+0x372b44] (no source info available) +V [jvm.dll+0x886720] (no source info available) +V [jvm.dll+0x887a47] (no source info available) +V [jvm.dll+0x887f78] (no source info available) +V [jvm.dll+0x888213] (no source info available) +V [jvm.dll+0x824f8b] (no source info available) +V [jvm.dll+0x6df065] (no source info available) +C [ucrtbase.dll+0x26b4c] (no source info available) +C [KERNEL32.DLL+0x14de0] (no source info available) +C [ntdll.dll+0x7e3db] (no source info available) + +VM_Operation (0x0000000f5d1fefe0): G1CollectForAllocation, mode: safepoint, requested by thread 0x0000016c582cb070 + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x0000016c5de0b5d0, length=67, elements={ +0x0000016c60b2eec0, 0x0000016c580e9e50, 0x0000016c580eca70, 0x0000016c580edef0, +0x0000016c580ee950, 0x0000016c580fb990, 0x0000016c580fc800, 0x0000016c58109860, +0x0000016c5810ad60, 0x0000016c582310e0, 0x0000016c582c6690, 0x0000016c582cb070, +0x0000016c58357a60, 0x0000016c5836cf60, 0x0000016c583588f0, 0x0000016c58359370, +0x0000016c58361f70, 0x0000016c58363210, 0x0000016c5835f150, 0x0000016c58373510, +0x0000016c58370090, 0x0000016c583727f0, 0x0000016c58372e80, 0x0000016c58370720, +0x0000016c58370db0, 0x0000016c58371ad0, 0x0000016c58371440, 0x0000016c58372160, +0x0000016c58392620, 0x0000016c58392cb0, 0x0000016c583939d0, 0x0000016c5838f830, +0x0000016c5838f1a0, 0x0000016c5838eb10, 0x0000016c58390be0, 0x0000016c5838fec0, +0x0000016c58394060, 0x0000016c58393340, 0x0000016c583946f0, 0x0000016c58391270, +0x0000016c58390550, 0x0000016c58391900, 0x0000016c58391f90, 0x0000016c58394d80, +0x0000016c58395410, 0x0000016c58395aa0, 0x0000016c58396130, 0x0000016c583dbe00, +0x0000016c583dc490, 0x0000016c583de560, 0x0000016c583dcb20, 0x0000016c583dded0, +0x0000016c583e0cc0, 0x0000016c583e0630, 0x0000016c583debf0, 0x0000016c583db770, +0x0000016c583e1350, 0x0000016c583dd1b0, 0x0000016c583df280, 0x0000016c583df910, +0x0000016c583dd840, 0x0000016c583dffa0, 0x0000016c583e19e0, 0x0000016c583e2070, +0x0000016c583e2700, 0x0000016c583e2d90, 0x0000016c5851ebf0 +} + +Java Threads: ( => current thread ) + 0x0000016c60b2eec0 JavaThread "main" [_thread_blocked, id=45052, stack(0x0000000f5bb00000,0x0000000f5bc00000) (1024K)] + 0x0000016c580e9e50 JavaThread "Reference Handler" daemon [_thread_blocked, id=29176, stack(0x0000000f5c300000,0x0000000f5c400000) (1024K)] + 0x0000016c580eca70 JavaThread "Finalizer" daemon [_thread_blocked, id=28088, stack(0x0000000f5c400000,0x0000000f5c500000) (1024K)] + 0x0000016c580edef0 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=50360, stack(0x0000000f5c500000,0x0000000f5c600000) (1024K)] + 0x0000016c580ee950 JavaThread "Attach Listener" daemon [_thread_blocked, id=60964, stack(0x0000000f5c600000,0x0000000f5c700000) (1024K)] + 0x0000016c580fb990 JavaThread "Service Thread" daemon [_thread_blocked, id=83544, stack(0x0000000f5c700000,0x0000000f5c800000) (1024K)] + 0x0000016c580fc800 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=85920, stack(0x0000000f5c800000,0x0000000f5c900000) (1024K)] + 0x0000016c58109860 JavaThread "JVMCI-native CompilerThread0" daemon [_thread_blocked, id=68060, stack(0x0000000f5c900000,0x0000000f5ca00000) (1024K)] + 0x0000016c5810ad60 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=83524, stack(0x0000000f5ca00000,0x0000000f5cb00000) (1024K)] + 0x0000016c582310e0 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=62252, stack(0x0000000f5cb00000,0x0000000f5cc00000) (1024K)] + 0x0000016c582c6690 JavaThread "Notification Thread" daemon [_thread_blocked, id=60032, stack(0x0000000f5d000000,0x0000000f5d100000) (1024K)] + 0x0000016c582cb070 JavaThread "Thread-0" [_thread_blocked, id=82844, stack(0x0000000f5d100000,0x0000000f5d200000) (1024K)] + 0x0000016c58357a60 JavaThread "ForkJoinPool.commonPool-worker-1" daemon [_thread_blocked, id=81496, stack(0x0000000f5d500000,0x0000000f5d600000) (1024K)] + 0x0000016c5836cf60 JavaThread "ForkJoinPool.commonPool-worker-2" daemon [_thread_blocked, id=35456, stack(0x0000000f5d600000,0x0000000f5d700000) (1024K)] + 0x0000016c583588f0 JavaThread "ForkJoinPool.commonPool-worker-3" daemon [_thread_blocked, id=87132, stack(0x0000000f5d700000,0x0000000f5d800000) (1024K)] + 0x0000016c58359370 JavaThread "ForkJoinPool.commonPool-worker-4" daemon [_thread_blocked, id=63832, stack(0x0000000f5d800000,0x0000000f5d900000) (1024K)] + 0x0000016c58361f70 JavaThread "ForkJoinPool.commonPool-worker-5" daemon [_thread_blocked, id=77160, stack(0x0000000f5d900000,0x0000000f5da00000) (1024K)] + 0x0000016c58363210 JavaThread "ForkJoinPool.commonPool-worker-6" daemon [_thread_blocked, id=54012, stack(0x0000000f5da00000,0x0000000f5db00000) (1024K)] + 0x0000016c5835f150 JavaThread "ForkJoinPool.commonPool-worker-7" daemon [_thread_blocked, id=44532, stack(0x0000000f5db00000,0x0000000f5dc00000) (1024K)] + 0x0000016c58373510 JavaThread "ForkJoinPool.commonPool-worker-8" daemon [_thread_blocked, id=75220, stack(0x0000000f5dc00000,0x0000000f5dd00000) (1024K)] + 0x0000016c58370090 JavaThread "ForkJoinPool.commonPool-worker-9" daemon [_thread_blocked, id=49776, stack(0x0000000f5dd00000,0x0000000f5de00000) (1024K)] + 0x0000016c583727f0 JavaThread "ForkJoinPool.commonPool-worker-11" daemon [_thread_blocked, id=68244, stack(0x0000000f5de00000,0x0000000f5df00000) (1024K)] + 0x0000016c58372e80 JavaThread "ForkJoinPool.commonPool-worker-10" daemon [_thread_blocked, id=57564, stack(0x0000000f5df00000,0x0000000f5e000000) (1024K)] + 0x0000016c58370720 JavaThread "ForkJoinPool.commonPool-worker-12" daemon [_thread_blocked, id=32800, stack(0x0000000f5e000000,0x0000000f5e100000) (1024K)] + 0x0000016c58370db0 JavaThread "ForkJoinPool.commonPool-worker-13" daemon [_thread_blocked, id=51912, stack(0x0000000f5e100000,0x0000000f5e200000) (1024K)] + 0x0000016c58371ad0 JavaThread "ForkJoinPool.commonPool-worker-18" daemon [_thread_blocked, id=65772, stack(0x0000000f5e200000,0x0000000f5e300000) (1024K)] + 0x0000016c58371440 JavaThread "ForkJoinPool.commonPool-worker-15" daemon [_thread_blocked, id=37880, stack(0x0000000f5e300000,0x0000000f5e400000) (1024K)] + 0x0000016c58372160 JavaThread "ForkJoinPool.commonPool-worker-24" daemon [_thread_blocked, id=59420, stack(0x0000000f5e400000,0x0000000f5e500000) (1024K)] + 0x0000016c58392620 JavaThread "ForkJoinPool.commonPool-worker-17" daemon [_thread_blocked, id=72856, stack(0x0000000f5e500000,0x0000000f5e600000) (1024K)] + 0x0000016c58392cb0 JavaThread "ForkJoinPool.commonPool-worker-31" daemon [_thread_blocked, id=35700, stack(0x0000000f5e600000,0x0000000f5e700000) (1024K)] + 0x0000016c583939d0 JavaThread "ForkJoinPool.commonPool-worker-19" daemon [_thread_blocked, id=88756, stack(0x0000000f5e700000,0x0000000f5e800000) (1024K)] + 0x0000016c5838f830 JavaThread "ForkJoinPool.commonPool-worker-20" daemon [_thread_blocked, id=39544, stack(0x0000000f5e800000,0x0000000f5e900000) (1024K)] + 0x0000016c5838f1a0 JavaThread "ForkJoinPool.commonPool-worker-21" daemon [_thread_blocked, id=58320, stack(0x0000000f5e900000,0x0000000f5ea00000) (1024K)] + 0x0000016c5838eb10 JavaThread "ForkJoinPool.commonPool-worker-22" daemon [_thread_blocked, id=82040, stack(0x0000000f5ea00000,0x0000000f5eb00000) (1024K)] + 0x0000016c58390be0 JavaThread "ForkJoinPool.commonPool-worker-38" daemon [_thread_blocked, id=15096, stack(0x0000000f5eb00000,0x0000000f5ec00000) (1024K)] + 0x0000016c5838fec0 JavaThread "ForkJoinPool.commonPool-worker-25" daemon [_thread_blocked, id=52120, stack(0x0000000f5ec00000,0x0000000f5ed00000) (1024K)] + 0x0000016c58394060 JavaThread "ForkJoinPool.commonPool-worker-16" daemon [_thread_blocked, id=64948, stack(0x0000000f5ed00000,0x0000000f5ee00000) (1024K)] + 0x0000016c58393340 JavaThread "ForkJoinPool.commonPool-worker-26" daemon [_thread_blocked, id=31312, stack(0x0000000f5ee00000,0x0000000f5ef00000) (1024K)] + 0x0000016c583946f0 JavaThread "ForkJoinPool.commonPool-worker-27" daemon [_thread_blocked, id=34228, stack(0x0000000f5ef00000,0x0000000f5f000000) (1024K)] + 0x0000016c58391270 JavaThread "ForkJoinPool.commonPool-worker-47" daemon [_thread_blocked, id=62248, stack(0x0000000f5f000000,0x0000000f5f100000) (1024K)] + 0x0000016c58390550 JavaThread "ForkJoinPool.commonPool-worker-29" daemon [_thread_blocked, id=46784, stack(0x0000000f5f100000,0x0000000f5f200000) (1024K)] + 0x0000016c58391900 JavaThread "ForkJoinPool.commonPool-worker-30" daemon [_thread_blocked, id=70156, stack(0x0000000f5f200000,0x0000000f5f300000) (1024K)] + 0x0000016c58391f90 JavaThread "ForkJoinPool.commonPool-worker-14" daemon [_thread_blocked, id=39676, stack(0x0000000f5f300000,0x0000000f5f400000) (1024K)] + 0x0000016c58394d80 JavaThread "ForkJoinPool.commonPool-worker-32" daemon [_thread_blocked, id=67984, stack(0x0000000f5f400000,0x0000000f5f500000) (1024K)] + 0x0000016c58395410 JavaThread "ForkJoinPool.commonPool-worker-33" daemon [_thread_blocked, id=89172, stack(0x0000000f5f500000,0x0000000f5f600000) (1024K)] + 0x0000016c58395aa0 JavaThread "ForkJoinPool.commonPool-worker-34" daemon [_thread_blocked, id=33356, stack(0x0000000f5f600000,0x0000000f5f700000) (1024K)] + 0x0000016c58396130 JavaThread "ForkJoinPool.commonPool-worker-35" daemon [_thread_blocked, id=59928, stack(0x0000000f5f700000,0x0000000f5f800000) (1024K)] + 0x0000016c583dbe00 JavaThread "ForkJoinPool.commonPool-worker-36" daemon [_thread_blocked, id=87112, stack(0x0000000f5f800000,0x0000000f5f900000) (1024K)] + 0x0000016c583dc490 JavaThread "ForkJoinPool.commonPool-worker-37" daemon [_thread_blocked, id=53964, stack(0x0000000f5f900000,0x0000000f5fa00000) (1024K)] + 0x0000016c583de560 JavaThread "ForkJoinPool.commonPool-worker-23" daemon [_thread_blocked, id=90448, stack(0x0000000f5fa00000,0x0000000f5fb00000) (1024K)] + 0x0000016c583dcb20 JavaThread "ForkJoinPool.commonPool-worker-39" daemon [_thread_blocked, id=39784, stack(0x0000000f5fb00000,0x0000000f5fc00000) (1024K)] + 0x0000016c583dded0 JavaThread "ForkJoinPool.commonPool-worker-40" daemon [_thread_blocked, id=42380, stack(0x0000000f5fc00000,0x0000000f5fd00000) (1024K)] + 0x0000016c583e0cc0 JavaThread "ForkJoinPool.commonPool-worker-41" daemon [_thread_blocked, id=47440, stack(0x0000000f5fd00000,0x0000000f5fe00000) (1024K)] + 0x0000016c583e0630 JavaThread "ForkJoinPool.commonPool-worker-42" daemon [_thread_blocked, id=65756, stack(0x0000000f5fe00000,0x0000000f5ff00000) (1024K)] + 0x0000016c583debf0 JavaThread "ForkJoinPool.commonPool-worker-43" daemon [_thread_blocked, id=32812, stack(0x0000000f5ff00000,0x0000000f60000000) (1024K)] + 0x0000016c583db770 JavaThread "ForkJoinPool.commonPool-worker-44" daemon [_thread_blocked, id=75164, stack(0x0000000f60000000,0x0000000f60100000) (1024K)] + 0x0000016c583e1350 JavaThread "ForkJoinPool.commonPool-worker-45" daemon [_thread_blocked, id=80228, stack(0x0000000f60100000,0x0000000f60200000) (1024K)] + 0x0000016c583dd1b0 JavaThread "ForkJoinPool.commonPool-worker-46" daemon [_thread_blocked, id=55348, stack(0x0000000f60200000,0x0000000f60300000) (1024K)] + 0x0000016c583df280 JavaThread "ForkJoinPool.commonPool-worker-28" daemon [_thread_blocked, id=49808, stack(0x0000000f60300000,0x0000000f60400000) (1024K)] + 0x0000016c583df910 JavaThread "ForkJoinPool.commonPool-worker-48" daemon [_thread_blocked, id=70976, stack(0x0000000f60400000,0x0000000f60500000) (1024K)] + 0x0000016c583dd840 JavaThread "ForkJoinPool.commonPool-worker-49" daemon [_thread_blocked, id=49336, stack(0x0000000f60500000,0x0000000f60600000) (1024K)] + 0x0000016c583dffa0 JavaThread "ForkJoinPool.commonPool-worker-51" daemon [_thread_blocked, id=42120, stack(0x0000000f60600000,0x0000000f60700000) (1024K)] + 0x0000016c583e19e0 JavaThread "ForkJoinPool.commonPool-worker-50" daemon [_thread_blocked, id=63056, stack(0x0000000f60700000,0x0000000f60800000) (1024K)] + 0x0000016c583e2070 JavaThread "ForkJoinPool.commonPool-worker-54" daemon [_thread_blocked, id=74800, stack(0x0000000f62000000,0x0000000f62100000) (1024K)] + 0x0000016c583e2700 JavaThread "ForkJoinPool.commonPool-worker-53" daemon [_thread_blocked, id=76732, stack(0x0000000f62100000,0x0000000f62200000) (1024K)] + 0x0000016c583e2d90 JavaThread "ForkJoinPool.commonPool-worker-52" daemon [_thread_blocked, id=42632, stack(0x0000000f62200000,0x0000000f62300000) (1024K)] + 0x0000016c5851ebf0 JavaThread "ForkJoinPool.commonPool-worker-55" daemon [_thread_blocked, id=76168, stack(0x0000000f62300000,0x0000000f62400000) (1024K)] +Total: 67 + +Other Threads: +=>0x0000016c7e80d430 VMThread "VM Thread" [id=13556, stack(0x0000000f5c200000,0x0000000f5c300000) (1024K)] + 0x0000016c7e7f9320 WatcherThread "VM Periodic Task Thread" [id=86444, stack(0x0000000f5c100000,0x0000000f5c200000) (1024K)] + 0x0000016c7e65f990 WorkerThread "GC Thread#0" [id=85180, stack(0x0000000f5bc00000,0x0000000f5bd00000) (1024K)] + 0x0000016c58410060 WorkerThread "GC Thread#1" [id=87232, stack(0x0000000f60900000,0x0000000f60a00000) (1024K)] + 0x0000016c58410410 WorkerThread "GC Thread#2" [id=80928, stack(0x0000000f60a00000,0x0000000f60b00000) (1024K)] + 0x0000016c58427ac0 WorkerThread "GC Thread#3" [id=63364, stack(0x0000000f60b00000,0x0000000f60c00000) (1024K)] + 0x0000016c58428280 WorkerThread "GC Thread#4" [id=43376, stack(0x0000000f60c00000,0x0000000f60d00000) (1024K)] + 0x0000016c58428630 WorkerThread "GC Thread#5" [id=15080, stack(0x0000000f60d00000,0x0000000f60e00000) (1024K)] + 0x0000016c5842ca00 WorkerThread "GC Thread#6" [id=60944, stack(0x0000000f60e00000,0x0000000f60f00000) (1024K)] + 0x0000016c58432dd0 WorkerThread "GC Thread#7" [id=89204, stack(0x0000000f60f00000,0x0000000f61000000) (1024K)] + 0x0000016c584375a0 WorkerThread "GC Thread#8" [id=90976, stack(0x0000000f61000000,0x0000000f61100000) (1024K)] + 0x0000016c58437950 WorkerThread "GC Thread#9" [id=85512, stack(0x0000000f61100000,0x0000000f61200000) (1024K)] + 0x0000016c58438110 WorkerThread "GC Thread#10" [id=63540, stack(0x0000000f61200000,0x0000000f61300000) (1024K)] + 0x0000016c584384c0 WorkerThread "GC Thread#11" [id=69832, stack(0x0000000f61300000,0x0000000f61400000) (1024K)] + 0x0000016c58438870 WorkerThread "GC Thread#12" [id=62144, stack(0x0000000f61400000,0x0000000f61500000) (1024K)] + 0x0000016c58439c40 WorkerThread "GC Thread#13" [id=41324, stack(0x0000000f61500000,0x0000000f61600000) (1024K)] + 0x0000016c5843b310 WorkerThread "GC Thread#14" [id=83940, stack(0x0000000f61600000,0x0000000f61700000) (1024K)] + 0x0000016c5843ba70 WorkerThread "GC Thread#15" [id=40028, stack(0x0000000f61700000,0x0000000f61800000) (1024K)] + 0x0000016c5843abb0 WorkerThread "GC Thread#16" [id=43160, stack(0x0000000f61800000,0x0000000f61900000) (1024K)] + 0x0000016c5843be20 WorkerThread "GC Thread#17" [id=25296, stack(0x0000000f61900000,0x0000000f61a00000) (1024K)] + 0x0000016c5843af60 WorkerThread "GC Thread#18" [id=33380, stack(0x0000000f61a00000,0x0000000f61b00000) (1024K)] + 0x0000016c5843a450 WorkerThread "GC Thread#19" [id=92308, stack(0x0000000f61b00000,0x0000000f61c00000) (1024K)] + 0x0000016c5843a800 WorkerThread "GC Thread#20" [id=53060, stack(0x0000000f61c00000,0x0000000f61d00000) (1024K)] + 0x0000016c5843b6c0 WorkerThread "GC Thread#21" [id=29380, stack(0x0000000f61d00000,0x0000000f61e00000) (1024K)] + 0x0000016c58447870 WorkerThread "GC Thread#22" [id=44248, stack(0x0000000f61e00000,0x0000000f61f00000) (1024K)] + 0x0000016c584499a0 WorkerThread "GC Thread#23" [id=45408, stack(0x0000000f61f00000,0x0000000f62000000) (1024K)] + 0x0000016c584495f0 WorkerThread "GC Thread#24" [id=56948, stack(0x0000000f62400000,0x0000000f62500000) (1024K)] + 0x0000016c58447fd0 WorkerThread "GC Thread#25" [id=76872, stack(0x0000000f62500000,0x0000000f62600000) (1024K)] + 0x0000016c58449d50 WorkerThread "GC Thread#26" [id=42688, stack(0x0000000f62600000,0x0000000f62700000) (1024K)] + 0x0000016c5844ac10 WorkerThread "GC Thread#27" [id=63104, stack(0x0000000f62700000,0x0000000f62800000) (1024K)] + 0x0000016c58448730 WorkerThread "GC Thread#28" [id=93524, stack(0x0000000f62800000,0x0000000f62900000) (1024K)] + 0x0000016c58448ae0 WorkerThread "GC Thread#29" [id=63168, stack(0x0000000f62900000,0x0000000f62a00000) (1024K)] + 0x0000016c58448e90 WorkerThread "GC Thread#30" [id=28124, stack(0x0000000f62a00000,0x0000000f62b00000) (1024K)] + 0x0000016c58449240 WorkerThread "GC Thread#31" [id=42284, stack(0x0000000f62b00000,0x0000000f62c00000) (1024K)] + 0x0000016c58447c20 WorkerThread "GC Thread#32" [id=73652, stack(0x0000000f62c00000,0x0000000f62d00000) (1024K)] + 0x0000016c58448380 WorkerThread "GC Thread#33" [id=35496, stack(0x0000000f62d00000,0x0000000f62e00000) (1024K)] + 0x0000016c5844a100 WorkerThread "GC Thread#34" [id=90164, stack(0x0000000f62e00000,0x0000000f62f00000) (1024K)] + 0x0000016c5844a860 WorkerThread "GC Thread#35" [id=24140, stack(0x0000000f62f00000,0x0000000f63000000) (1024K)] + 0x0000016c5844afc0 WorkerThread "GC Thread#36" [id=38588, stack(0x0000000f63000000,0x0000000f63100000) (1024K)] + 0x0000016c584474c0 WorkerThread "GC Thread#37" [id=31728, stack(0x0000000f63100000,0x0000000f63200000) (1024K)] + 0x0000016c6304e650 ConcurrentGCThread "G1 Main Marker" [id=43984, stack(0x0000000f5bd00000,0x0000000f5be00000) (1024K)] + 0x0000016c7e6a2270 WorkerThread "G1 Conc#0" [id=28056, stack(0x0000000f5be00000,0x0000000f5bf00000) (1024K)] + 0x0000016c581fa9b0 WorkerThread "G1 Conc#1" [id=54488, stack(0x0000000f5cd00000,0x0000000f5ce00000) (1024K)] + 0x0000016c581fa250 WorkerThread "G1 Conc#2" [id=81244, stack(0x0000000f5ce00000,0x0000000f5cf00000) (1024K)] + 0x0000016c581fa600 WorkerThread "G1 Conc#3" [id=992, stack(0x0000000f5cf00000,0x0000000f5d000000) (1024K)] + 0x0000016c581f9ea0 WorkerThread "G1 Conc#4" [id=34860, stack(0x0000000f5d200000,0x0000000f5d300000) (1024K)] + 0x0000016c5d8bce90 WorkerThread "G1 Conc#5" [id=33132, stack(0x0000000f5d300000,0x0000000f5d400000) (1024K)] + 0x0000016c5d8bd5f0 WorkerThread "G1 Conc#6" [id=77912, stack(0x0000000f5d400000,0x0000000f5d500000) (1024K)] + 0x0000016c5d8bcae0 WorkerThread "G1 Conc#7" [id=75244, stack(0x0000000f60800000,0x0000000f60900000) (1024K)] + 0x0000016c5d8bd240 WorkerThread "G1 Conc#8" [id=57480, stack(0x0000000f63200000,0x0000000f63300000) (1024K)] + 0x0000016c5daef090 WorkerThread "G1 Conc#9" [id=52160, stack(0x0000000f63300000,0x0000000f63400000) (1024K)] + 0x0000016c7e79d3f0 ConcurrentGCThread "G1 Refine#0" [id=66872, stack(0x0000000f5bf00000,0x0000000f5c000000) (1024K)] + 0x0000016c5d8c9660 ConcurrentGCThread "G1 Refine#1" [id=70168, stack(0x0000000f5cc00000,0x0000000f5cd00000) (1024K)] + 0x0000016c7e79e420 ConcurrentGCThread "G1 Service" [id=31352, stack(0x0000000f5c000000,0x0000000f5c100000) (1024K)] +Total: 54 + +Threads with active compile tasks: +Total: 0 + +VM state: at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) +[0x00007ffdace33910] Threads_lock - owner thread: 0x0000016c7e80d430 +[0x00007ffdace33a10] Heap_lock - owner thread: 0x0000016c582cb070 + +Heap address: 0x0000000407000000, size: 16272 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 + +CDS archive(s) mapped at: [0x0000016c17000000-0x0000016c17d80000-0x0000016c17d80000), size 14155776, SharedBaseAddress: 0x0000016c17000000, ArchiveRelocationMode: 1. +Compressed class space mapped at: 0x0000016c18000000-0x0000016c58000000, reserved size: 1073741824 +Narrow klass base: 0x0000016c17000000, Narrow klass shift: 0, Narrow klass range: 0x41000000 + +GC Precious Log: + CardTable entry size: 512 + Card Set container configuration: InlinePtr #cards 4 size 8 Array Of Cards #cards 64 size 144 Howl #buckets 8 coarsen threshold 14745 Howl Bitmap #cards 2048 size 272 coarsen threshold 1843 Card regions per heap region 1 cards per card region 16384 + CPUs: 56 total, 56 available + Memory: 65072M + Large Page Support: Disabled + NUMA Support: Disabled + Compressed Oops: Enabled (Zero based) + Heap Region Size: 8M + Heap Min Capacity: 8M + Heap Initial Capacity: 1G + Heap Max Capacity: 16272M + Pre-touch: Disabled + Parallel Workers: 38 + Concurrent Workers: 10 + Concurrent Refinement Workers: 38 + Periodic GC: Disabled + +Heap: + garbage-first heap total reserved 16662528K, committed 13565952K, used 8408821K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 11 young (90112K), 11 survivors (90112K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K + +Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, TAMS=top-at-mark-start, PB=parsable bottom +| 0|0x0000000407000000, 0x0000000407800000, 0x0000000407800000|100%| O| |TAMS 0x0000000407000000| PB 0x0000000407000000| Untracked | 0 +| 1|0x0000000407800000, 0x0000000408000000, 0x0000000408000000|100%| O| |TAMS 0x0000000407800000| PB 0x0000000407800000| Untracked | 0 +| 2|0x0000000408000000, 0x0000000408800000, 0x0000000408800000|100%| O| |TAMS 0x0000000408000000| PB 0x0000000408000000| Untracked | 0 +| 3|0x0000000408800000, 0x0000000409000000, 0x0000000409000000|100%| O| |TAMS 0x0000000408800000| PB 0x0000000408800000| Untracked | 0 +| 4|0x0000000409000000, 0x0000000409800000, 0x0000000409800000|100%| O| |TAMS 0x0000000409000000| PB 0x0000000409000000| Untracked | 0 +| 5|0x0000000409800000, 0x000000040a000000, 0x000000040a000000|100%| O| |TAMS 0x0000000409800000| PB 0x0000000409800000| Untracked | 0 +| 6|0x000000040a000000, 0x000000040a800000, 0x000000040a800000|100%| O| |TAMS 0x000000040a000000| PB 0x000000040a000000| Untracked | 0 +| 7|0x000000040a800000, 0x000000040b000000, 0x000000040b000000|100%| O| |TAMS 0x000000040a800000| PB 0x000000040a800000| Untracked | 0 +| 8|0x000000040b000000, 0x000000040b800000, 0x000000040b800000|100%| O| |TAMS 0x000000040b000000| PB 0x000000040b000000| Untracked | 0 +| 9|0x000000040b800000, 0x000000040c000000, 0x000000040c000000|100%| O| |TAMS 0x000000040b800000| PB 0x000000040b800000| Untracked | 0 +| 10|0x000000040c000000, 0x000000040c800000, 0x000000040c800000|100%| O| |TAMS 0x000000040c000000| PB 0x000000040c000000| Untracked | 0 +| 11|0x000000040c800000, 0x000000040d000000, 0x000000040d000000|100%| O| |TAMS 0x000000040c800000| PB 0x000000040c800000| Untracked | 0 +| 12|0x000000040d000000, 0x000000040d800000, 0x000000040d800000|100%| O| |TAMS 0x000000040d000000| PB 0x000000040d000000| Untracked | 0 +| 13|0x000000040d800000, 0x000000040e000000, 0x000000040e000000|100%| O| |TAMS 0x000000040d800000| PB 0x000000040d800000| Untracked | 0 +| 14|0x000000040e000000, 0x000000040e800000, 0x000000040e800000|100%| O| |TAMS 0x000000040e000000| PB 0x000000040e000000| Untracked | 0 +| 15|0x000000040e800000, 0x000000040f000000, 0x000000040f000000|100%| O| |TAMS 0x000000040e800000| PB 0x000000040e800000| Untracked | 0 +| 16|0x000000040f000000, 0x000000040f800000, 0x000000040f800000|100%| O| |TAMS 0x000000040f000000| PB 0x000000040f000000| Untracked | 0 +| 17|0x000000040f800000, 0x0000000410000000, 0x0000000410000000|100%| O| |TAMS 0x000000040f800000| PB 0x000000040f800000| Untracked | 0 +| 18|0x0000000410000000, 0x0000000410800000, 0x0000000410800000|100%| O| |TAMS 0x0000000410000000| PB 0x0000000410000000| Untracked | 0 +| 19|0x0000000410800000, 0x0000000411000000, 0x0000000411000000|100%| O| |TAMS 0x0000000410800000| PB 0x0000000410800000| Untracked | 0 +| 20|0x0000000411000000, 0x0000000411800000, 0x0000000411800000|100%| O| |TAMS 0x0000000411000000| PB 0x0000000411000000| Untracked | 0 +| 21|0x0000000411800000, 0x0000000412000000, 0x0000000412000000|100%| O| |TAMS 0x0000000411800000| PB 0x0000000411800000| Untracked | 0 +| 22|0x0000000412000000, 0x0000000412800000, 0x0000000412800000|100%| O| |TAMS 0x0000000412000000| PB 0x0000000412000000| Untracked | 0 +| 23|0x0000000412800000, 0x0000000413000000, 0x0000000413000000|100%| O| |TAMS 0x0000000412800000| PB 0x0000000412800000| Untracked | 0 +| 24|0x0000000413000000, 0x0000000413800000, 0x0000000413800000|100%| O| |TAMS 0x0000000413000000| PB 0x0000000413000000| Untracked | 0 +| 25|0x0000000413800000, 0x0000000414000000, 0x0000000414000000|100%| O| |TAMS 0x0000000413800000| PB 0x0000000413800000| Untracked | 0 +| 26|0x0000000414000000, 0x0000000414800000, 0x0000000414800000|100%| O| |TAMS 0x0000000414000000| PB 0x0000000414000000| Untracked | 0 +| 27|0x0000000414800000, 0x0000000415000000, 0x0000000415000000|100%| O| |TAMS 0x0000000414800000| PB 0x0000000414800000| Untracked | 0 +| 28|0x0000000415000000, 0x0000000415800000, 0x0000000415800000|100%| O| |TAMS 0x0000000415000000| PB 0x0000000415000000| Untracked | 0 +| 29|0x0000000415800000, 0x0000000416000000, 0x0000000416000000|100%| O| |TAMS 0x0000000415800000| PB 0x0000000415800000| Untracked | 0 +| 30|0x0000000416000000, 0x0000000416800000, 0x0000000416800000|100%| O| |TAMS 0x0000000416000000| PB 0x0000000416000000| Untracked | 0 +| 31|0x0000000416800000, 0x0000000417000000, 0x0000000417000000|100%| O| |TAMS 0x0000000416800000| PB 0x0000000416800000| Untracked | 0 +| 32|0x0000000417000000, 0x0000000417800000, 0x0000000417800000|100%| O| |TAMS 0x0000000417000000| PB 0x0000000417000000| Untracked | 0 +| 33|0x0000000417800000, 0x0000000418000000, 0x0000000418000000|100%| O| |TAMS 0x0000000417800000| PB 0x0000000417800000| Untracked | 0 +| 34|0x0000000418000000, 0x0000000418800000, 0x0000000418800000|100%| O| |TAMS 0x0000000418000000| PB 0x0000000418000000| Untracked | 0 +| 35|0x0000000418800000, 0x0000000419000000, 0x0000000419000000|100%| O| |TAMS 0x0000000418800000| PB 0x0000000418800000| Untracked | 0 +| 36|0x0000000419000000, 0x0000000419800000, 0x0000000419800000|100%| O| |TAMS 0x0000000419000000| PB 0x0000000419000000| Untracked | 0 +| 37|0x0000000419800000, 0x000000041a000000, 0x000000041a000000|100%| O| |TAMS 0x0000000419800000| PB 0x0000000419800000| Untracked | 0 +| 38|0x000000041a000000, 0x000000041a800000, 0x000000041a800000|100%| O| |TAMS 0x000000041a000000| PB 0x000000041a000000| Untracked | 0 +| 39|0x000000041a800000, 0x000000041b000000, 0x000000041b000000|100%| O| |TAMS 0x000000041a800000| PB 0x000000041a800000| Untracked | 0 +| 40|0x000000041b000000, 0x000000041b800000, 0x000000041b800000|100%| O| |TAMS 0x000000041b000000| PB 0x000000041b000000| Untracked | 0 +| 41|0x000000041b800000, 0x000000041c000000, 0x000000041c000000|100%| O| |TAMS 0x000000041b800000| PB 0x000000041b800000| Untracked | 0 +| 42|0x000000041c000000, 0x000000041c800000, 0x000000041c800000|100%| O| |TAMS 0x000000041c000000| PB 0x000000041c000000| Untracked | 0 +| 43|0x000000041c800000, 0x000000041d000000, 0x000000041d000000|100%| O| |TAMS 0x000000041c800000| PB 0x000000041c800000| Untracked | 0 +| 44|0x000000041d000000, 0x000000041d800000, 0x000000041d800000|100%| O| |TAMS 0x000000041d000000| PB 0x000000041d000000| Untracked | 0 +| 45|0x000000041d800000, 0x000000041e000000, 0x000000041e000000|100%| O| |TAMS 0x000000041d800000| PB 0x000000041d800000| Untracked | 0 +| 46|0x000000041e000000, 0x000000041e800000, 0x000000041e800000|100%| O| |TAMS 0x000000041e000000| PB 0x000000041e000000| Untracked | 0 +| 47|0x000000041e800000, 0x000000041f000000, 0x000000041f000000|100%| O| |TAMS 0x000000041e800000| PB 0x000000041e800000| Untracked | 0 +| 48|0x000000041f000000, 0x000000041f800000, 0x000000041f800000|100%| O| |TAMS 0x000000041f000000| PB 0x000000041f000000| Untracked | 0 +| 49|0x000000041f800000, 0x0000000420000000, 0x0000000420000000|100%| O| |TAMS 0x000000041f800000| PB 0x000000041f800000| Untracked | 0 +| 50|0x0000000420000000, 0x0000000420800000, 0x0000000420800000|100%| O| |TAMS 0x0000000420000000| PB 0x0000000420000000| Untracked | 0 +| 51|0x0000000420800000, 0x0000000421000000, 0x0000000421000000|100%| O| |TAMS 0x0000000420800000| PB 0x0000000420800000| Untracked | 0 +| 52|0x0000000421000000, 0x0000000421800000, 0x0000000421800000|100%| O| |TAMS 0x0000000421000000| PB 0x0000000421000000| Untracked | 0 +| 53|0x0000000421800000, 0x0000000422000000, 0x0000000422000000|100%| O| |TAMS 0x0000000421800000| PB 0x0000000421800000| Untracked | 0 +| 54|0x0000000422000000, 0x0000000422800000, 0x0000000422800000|100%| O| |TAMS 0x0000000422000000| PB 0x0000000422000000| Untracked | 0 +| 55|0x0000000422800000, 0x0000000423000000, 0x0000000423000000|100%| O| |TAMS 0x0000000422800000| PB 0x0000000422800000| Untracked | 0 +| 56|0x0000000423000000, 0x0000000423800000, 0x0000000423800000|100%| O| |TAMS 0x0000000423000000| PB 0x0000000423000000| Untracked | 0 +| 57|0x0000000423800000, 0x0000000424000000, 0x0000000424000000|100%| O| |TAMS 0x0000000423800000| PB 0x0000000423800000| Untracked | 0 +| 58|0x0000000424000000, 0x0000000424800000, 0x0000000424800000|100%| O| |TAMS 0x0000000424000000| PB 0x0000000424000000| Untracked | 0 +| 59|0x0000000424800000, 0x0000000425000000, 0x0000000425000000|100%| O| |TAMS 0x0000000424800000| PB 0x0000000424800000| Untracked | 0 +| 60|0x0000000425000000, 0x0000000425800000, 0x0000000425800000|100%| O| |TAMS 0x0000000425000000| PB 0x0000000425000000| Untracked | 0 +| 61|0x0000000425800000, 0x0000000426000000, 0x0000000426000000|100%| O| |TAMS 0x0000000425800000| PB 0x0000000425800000| Untracked | 0 +| 62|0x0000000426000000, 0x0000000426800000, 0x0000000426800000|100%| O| |TAMS 0x0000000426000000| PB 0x0000000426000000| Untracked | 0 +| 63|0x0000000426800000, 0x0000000427000000, 0x0000000427000000|100%| O| |TAMS 0x0000000426800000| PB 0x0000000426800000| Untracked | 0 +| 64|0x0000000427000000, 0x0000000427800000, 0x0000000427800000|100%| O| |TAMS 0x0000000427000000| PB 0x0000000427000000| Untracked | 0 +| 65|0x0000000427800000, 0x0000000428000000, 0x0000000428000000|100%| O| |TAMS 0x0000000427800000| PB 0x0000000427800000| Untracked | 0 +| 66|0x0000000428000000, 0x0000000428800000, 0x0000000428800000|100%| O| |TAMS 0x0000000428000000| PB 0x0000000428000000| Untracked | 0 +| 67|0x0000000428800000, 0x0000000429000000, 0x0000000429000000|100%| O| |TAMS 0x0000000428800000| PB 0x0000000428800000| Untracked | 0 +| 68|0x0000000429000000, 0x0000000429800000, 0x0000000429800000|100%| O| |TAMS 0x0000000429000000| PB 0x0000000429000000| Untracked | 0 +| 69|0x0000000429800000, 0x000000042a000000, 0x000000042a000000|100%| O| |TAMS 0x0000000429800000| PB 0x0000000429800000| Untracked | 0 +| 70|0x000000042a000000, 0x000000042a800000, 0x000000042a800000|100%| O| |TAMS 0x000000042a000000| PB 0x000000042a000000| Untracked | 0 +| 71|0x000000042a800000, 0x000000042b000000, 0x000000042b000000|100%| O| |TAMS 0x000000042a800000| PB 0x000000042a800000| Untracked | 0 +| 72|0x000000042b000000, 0x000000042b800000, 0x000000042b800000|100%| O| |TAMS 0x000000042b000000| PB 0x000000042b000000| Untracked | 0 +| 73|0x000000042b800000, 0x000000042c000000, 0x000000042c000000|100%| O| |TAMS 0x000000042b800000| PB 0x000000042b800000| Untracked | 0 +| 74|0x000000042c000000, 0x000000042c800000, 0x000000042c800000|100%| O| |TAMS 0x000000042c000000| PB 0x000000042c000000| Untracked | 0 +| 75|0x000000042c800000, 0x000000042d000000, 0x000000042d000000|100%| O| |TAMS 0x000000042c800000| PB 0x000000042c800000| Untracked | 0 +| 76|0x000000042d000000, 0x000000042d800000, 0x000000042d800000|100%| O| |TAMS 0x000000042d000000| PB 0x000000042d000000| Untracked | 0 +| 77|0x000000042d800000, 0x000000042e000000, 0x000000042e000000|100%| O| |TAMS 0x000000042d800000| PB 0x000000042d800000| Untracked | 0 +| 78|0x000000042e000000, 0x000000042e800000, 0x000000042e800000|100%| O| |TAMS 0x000000042e000000| PB 0x000000042e000000| Untracked | 0 +| 79|0x000000042e800000, 0x000000042f000000, 0x000000042f000000|100%| O| |TAMS 0x000000042e800000| PB 0x000000042e800000| Untracked | 0 +| 80|0x000000042f000000, 0x000000042f800000, 0x000000042f800000|100%| O| |TAMS 0x000000042f000000| PB 0x000000042f000000| Untracked | 0 +| 81|0x000000042f800000, 0x0000000430000000, 0x0000000430000000|100%| O| |TAMS 0x000000042f800000| PB 0x000000042f800000| Untracked | 0 +| 82|0x0000000430000000, 0x0000000430800000, 0x0000000430800000|100%| O| |TAMS 0x0000000430000000| PB 0x0000000430000000| Untracked | 0 +| 83|0x0000000430800000, 0x0000000431000000, 0x0000000431000000|100%| O| |TAMS 0x0000000430800000| PB 0x0000000430800000| Untracked | 0 +| 84|0x0000000431000000, 0x0000000431800000, 0x0000000431800000|100%| O| |TAMS 0x0000000431000000| PB 0x0000000431000000| Untracked | 0 +| 85|0x0000000431800000, 0x0000000432000000, 0x0000000432000000|100%| O| |TAMS 0x0000000431800000| PB 0x0000000431800000| Untracked | 0 +| 86|0x0000000432000000, 0x0000000432800000, 0x0000000432800000|100%| O| |TAMS 0x0000000432000000| PB 0x0000000432000000| Untracked | 0 +| 87|0x0000000432800000, 0x0000000433000000, 0x0000000433000000|100%| O| |TAMS 0x0000000432800000| PB 0x0000000432800000| Untracked | 0 +| 88|0x0000000433000000, 0x0000000433800000, 0x0000000433800000|100%| O| |TAMS 0x0000000433000000| PB 0x0000000433000000| Untracked | 0 +| 89|0x0000000433800000, 0x0000000434000000, 0x0000000434000000|100%| O| |TAMS 0x0000000433800000| PB 0x0000000433800000| Untracked | 0 +| 90|0x0000000434000000, 0x0000000434800000, 0x0000000434800000|100%| O| |TAMS 0x0000000434000000| PB 0x0000000434000000| Untracked | 0 +| 91|0x0000000434800000, 0x0000000435000000, 0x0000000435000000|100%| O| |TAMS 0x0000000434800000| PB 0x0000000434800000| Untracked | 0 +| 92|0x0000000435000000, 0x0000000435800000, 0x0000000435800000|100%| O| |TAMS 0x0000000435000000| PB 0x0000000435000000| Untracked | 0 +| 93|0x0000000435800000, 0x0000000436000000, 0x0000000436000000|100%| O| |TAMS 0x0000000435800000| PB 0x0000000435800000| Untracked | 0 +| 94|0x0000000436000000, 0x0000000436800000, 0x0000000436800000|100%| O| |TAMS 0x0000000436000000| PB 0x0000000436000000| Untracked | 0 +| 95|0x0000000436800000, 0x0000000437000000, 0x0000000437000000|100%| O| |TAMS 0x0000000436800000| PB 0x0000000436800000| Untracked | 0 +| 96|0x0000000437000000, 0x0000000437800000, 0x0000000437800000|100%|HS| |TAMS 0x0000000437000000| PB 0x0000000437000000| Untracked | 0 +| 97|0x0000000437800000, 0x0000000438000000, 0x0000000438000000|100%|HC| |TAMS 0x0000000437800000| PB 0x0000000437800000| Untracked | 0 +| 98|0x0000000438000000, 0x0000000438800000, 0x0000000438800000|100%|HC| |TAMS 0x0000000438000000| PB 0x0000000438000000| Untracked | 0 +| 99|0x0000000438800000, 0x0000000439000000, 0x0000000439000000|100%|HC| |TAMS 0x0000000438800000| PB 0x0000000438800000| Untracked | 0 +| 100|0x0000000439000000, 0x0000000439800000, 0x0000000439800000|100%|HC| |TAMS 0x0000000439000000| PB 0x0000000439000000| Untracked | 0 +| 101|0x0000000439800000, 0x000000043a000000, 0x000000043a000000|100%| O| |TAMS 0x0000000439800000| PB 0x0000000439800000| Untracked | 0 +| 102|0x000000043a000000, 0x000000043a800000, 0x000000043a800000|100%| O| |TAMS 0x000000043a000000| PB 0x000000043a000000| Untracked | 0 +| 103|0x000000043a800000, 0x000000043b000000, 0x000000043b000000|100%| O| |TAMS 0x000000043a800000| PB 0x000000043a800000| Untracked | 0 +| 104|0x000000043b000000, 0x000000043b800000, 0x000000043b800000|100%| O| |TAMS 0x000000043b000000| PB 0x000000043b000000| Untracked | 0 +| 105|0x000000043b800000, 0x000000043c000000, 0x000000043c000000|100%| O| |TAMS 0x000000043b800000| PB 0x000000043b800000| Untracked | 0 +| 106|0x000000043c000000, 0x000000043c800000, 0x000000043c800000|100%| O| |TAMS 0x000000043c000000| PB 0x000000043c000000| Untracked | 0 +| 107|0x000000043c800000, 0x000000043d000000, 0x000000043d000000|100%| O| |TAMS 0x000000043c800000| PB 0x000000043c800000| Untracked | 0 +| 108|0x000000043d000000, 0x000000043d800000, 0x000000043d800000|100%| O| |TAMS 0x000000043d000000| PB 0x000000043d000000| Untracked | 0 +| 109|0x000000043d800000, 0x000000043e000000, 0x000000043e000000|100%| O| |TAMS 0x000000043d800000| PB 0x000000043d800000| Untracked | 0 +| 110|0x000000043e000000, 0x000000043e800000, 0x000000043e800000|100%| O| |TAMS 0x000000043e000000| PB 0x000000043e000000| Untracked | 0 +| 111|0x000000043e800000, 0x000000043f000000, 0x000000043f000000|100%| O| |TAMS 0x000000043e800000| PB 0x000000043e800000| Untracked | 0 +| 112|0x000000043f000000, 0x000000043f800000, 0x000000043f800000|100%| O| |TAMS 0x000000043f000000| PB 0x000000043f000000| Untracked | 0 +| 113|0x000000043f800000, 0x0000000440000000, 0x0000000440000000|100%| O| |TAMS 0x000000043f800000| PB 0x000000043f800000| Untracked | 0 +| 114|0x0000000440000000, 0x0000000440800000, 0x0000000440800000|100%| O| |TAMS 0x0000000440000000| PB 0x0000000440000000| Untracked | 0 +| 115|0x0000000440800000, 0x0000000441000000, 0x0000000441000000|100%| O| |TAMS 0x0000000440800000| PB 0x0000000440800000| Untracked | 0 +| 116|0x0000000441000000, 0x0000000441800000, 0x0000000441800000|100%| O| |TAMS 0x0000000441000000| PB 0x0000000441000000| Untracked | 0 +| 117|0x0000000441800000, 0x0000000442000000, 0x0000000442000000|100%| O| |TAMS 0x0000000441800000| PB 0x0000000441800000| Untracked | 0 +| 118|0x0000000442000000, 0x0000000442800000, 0x0000000442800000|100%| O| |TAMS 0x0000000442000000| PB 0x0000000442000000| Untracked | 0 +| 119|0x0000000442800000, 0x0000000443000000, 0x0000000443000000|100%| O| |TAMS 0x0000000442800000| PB 0x0000000442800000| Untracked | 0 +| 120|0x0000000443000000, 0x0000000443800000, 0x0000000443800000|100%| O| |TAMS 0x0000000443000000| PB 0x0000000443000000| Untracked | 0 +| 121|0x0000000443800000, 0x0000000444000000, 0x0000000444000000|100%| O| |TAMS 0x0000000443800000| PB 0x0000000443800000| Untracked | 0 +| 122|0x0000000444000000, 0x0000000444800000, 0x0000000444800000|100%| O| |TAMS 0x0000000444000000| PB 0x0000000444000000| Untracked | 0 +| 123|0x0000000444800000, 0x0000000445000000, 0x0000000445000000|100%| O| |TAMS 0x0000000444800000| PB 0x0000000444800000| Untracked | 0 +| 124|0x0000000445000000, 0x0000000445800000, 0x0000000445800000|100%| O| |TAMS 0x0000000445000000| PB 0x0000000445000000| Untracked | 0 +| 125|0x0000000445800000, 0x0000000446000000, 0x0000000446000000|100%| O| |TAMS 0x0000000445800000| PB 0x0000000445800000| Untracked | 0 +| 126|0x0000000446000000, 0x0000000446800000, 0x0000000446800000|100%| O| |TAMS 0x0000000446000000| PB 0x0000000446000000| Untracked | 0 +| 127|0x0000000446800000, 0x0000000447000000, 0x0000000447000000|100%| O| |TAMS 0x0000000446800000| PB 0x0000000446800000| Untracked | 0 +| 128|0x0000000447000000, 0x0000000447800000, 0x0000000447800000|100%| O| |TAMS 0x0000000447000000| PB 0x0000000447000000| Untracked | 0 +| 129|0x0000000447800000, 0x0000000448000000, 0x0000000448000000|100%| O| |TAMS 0x0000000447800000| PB 0x0000000447800000| Untracked | 0 +| 130|0x0000000448000000, 0x0000000448800000, 0x0000000448800000|100%| O| |TAMS 0x0000000448000000| PB 0x0000000448000000| Untracked | 0 +| 131|0x0000000448800000, 0x0000000449000000, 0x0000000449000000|100%| O| |TAMS 0x0000000448800000| PB 0x0000000448800000| Untracked | 0 +| 132|0x0000000449000000, 0x0000000449800000, 0x0000000449800000|100%| O| |TAMS 0x0000000449000000| PB 0x0000000449000000| Untracked | 0 +| 133|0x0000000449800000, 0x000000044a000000, 0x000000044a000000|100%| O| |TAMS 0x0000000449800000| PB 0x0000000449800000| Untracked | 0 +| 134|0x000000044a000000, 0x000000044a800000, 0x000000044a800000|100%| O| |TAMS 0x000000044a000000| PB 0x000000044a000000| Untracked | 0 +| 135|0x000000044a800000, 0x000000044b000000, 0x000000044b000000|100%| O| |TAMS 0x000000044a800000| PB 0x000000044a800000| Untracked | 0 +| 136|0x000000044b000000, 0x000000044b800000, 0x000000044b800000|100%| O| |TAMS 0x000000044b000000| PB 0x000000044b000000| Untracked | 0 +| 137|0x000000044b800000, 0x000000044c000000, 0x000000044c000000|100%| O| |TAMS 0x000000044b800000| PB 0x000000044b800000| Untracked | 0 +| 138|0x000000044c000000, 0x000000044c800000, 0x000000044c800000|100%| O| |TAMS 0x000000044c000000| PB 0x000000044c000000| Untracked | 0 +| 139|0x000000044c800000, 0x000000044d000000, 0x000000044d000000|100%| O| |TAMS 0x000000044c800000| PB 0x000000044c800000| Untracked | 0 +| 140|0x000000044d000000, 0x000000044d800000, 0x000000044d800000|100%| O| |TAMS 0x000000044d000000| PB 0x000000044d000000| Untracked | 0 +| 141|0x000000044d800000, 0x000000044e000000, 0x000000044e000000|100%| O| |TAMS 0x000000044d800000| PB 0x000000044d800000| Untracked | 0 +| 142|0x000000044e000000, 0x000000044e800000, 0x000000044e800000|100%| O| |TAMS 0x000000044e000000| PB 0x000000044e000000| Untracked | 0 +| 143|0x000000044e800000, 0x000000044f000000, 0x000000044f000000|100%| O| |TAMS 0x000000044e800000| PB 0x000000044e800000| Untracked | 0 +| 144|0x000000044f000000, 0x000000044f800000, 0x000000044f800000|100%| O| |TAMS 0x000000044f000000| PB 0x000000044f000000| Untracked | 0 +| 145|0x000000044f800000, 0x0000000450000000, 0x0000000450000000|100%| O| |TAMS 0x000000044f800000| PB 0x000000044f800000| Untracked | 0 +| 146|0x0000000450000000, 0x0000000450800000, 0x0000000450800000|100%| O| |TAMS 0x0000000450000000| PB 0x0000000450000000| Untracked | 0 +| 147|0x0000000450800000, 0x0000000451000000, 0x0000000451000000|100%| O| |TAMS 0x0000000450800000| PB 0x0000000450800000| Untracked | 0 +| 148|0x0000000451000000, 0x0000000451800000, 0x0000000451800000|100%| O| |TAMS 0x0000000451000000| PB 0x0000000451000000| Untracked | 0 +| 149|0x0000000451800000, 0x0000000452000000, 0x0000000452000000|100%| O| |TAMS 0x0000000451800000| PB 0x0000000451800000| Untracked | 0 +| 150|0x0000000452000000, 0x0000000452800000, 0x0000000452800000|100%| O| |TAMS 0x0000000452000000| PB 0x0000000452000000| Untracked | 0 +| 151|0x0000000452800000, 0x0000000453000000, 0x0000000453000000|100%| O| |TAMS 0x0000000452800000| PB 0x0000000452800000| Untracked | 0 +| 152|0x0000000453000000, 0x0000000453800000, 0x0000000453800000|100%| O| |TAMS 0x0000000453000000| PB 0x0000000453000000| Untracked | 0 +| 153|0x0000000453800000, 0x0000000454000000, 0x0000000454000000|100%| O| |TAMS 0x0000000453800000| PB 0x0000000453800000| Untracked | 0 +| 154|0x0000000454000000, 0x0000000454800000, 0x0000000454800000|100%| O| |TAMS 0x0000000454000000| PB 0x0000000454000000| Untracked | 0 +| 155|0x0000000454800000, 0x0000000455000000, 0x0000000455000000|100%| O| |TAMS 0x0000000454800000| PB 0x0000000454800000| Untracked | 0 +| 156|0x0000000455000000, 0x0000000455800000, 0x0000000455800000|100%| O| |TAMS 0x0000000455000000| PB 0x0000000455000000| Untracked | 0 +| 157|0x0000000455800000, 0x0000000456000000, 0x0000000456000000|100%| O| |TAMS 0x0000000455800000| PB 0x0000000455800000| Untracked | 0 +| 158|0x0000000456000000, 0x0000000456800000, 0x0000000456800000|100%| O| |TAMS 0x0000000456000000| PB 0x0000000456000000| Untracked | 0 +| 159|0x0000000456800000, 0x0000000457000000, 0x0000000457000000|100%| O| |TAMS 0x0000000456800000| PB 0x0000000456800000| Untracked | 0 +| 160|0x0000000457000000, 0x0000000457800000, 0x0000000457800000|100%| O| |TAMS 0x0000000457000000| PB 0x0000000457000000| Untracked | 0 +| 161|0x0000000457800000, 0x0000000458000000, 0x0000000458000000|100%| O| |TAMS 0x0000000457800000| PB 0x0000000457800000| Untracked | 0 +| 162|0x0000000458000000, 0x0000000458800000, 0x0000000458800000|100%| O| |TAMS 0x0000000458000000| PB 0x0000000458000000| Untracked | 0 +| 163|0x0000000458800000, 0x0000000459000000, 0x0000000459000000|100%| O| |TAMS 0x0000000458800000| PB 0x0000000458800000| Untracked | 0 +| 164|0x0000000459000000, 0x0000000459800000, 0x0000000459800000|100%| O| |TAMS 0x0000000459000000| PB 0x0000000459000000| Untracked | 0 +| 165|0x0000000459800000, 0x000000045a000000, 0x000000045a000000|100%| O| |TAMS 0x0000000459800000| PB 0x0000000459800000| Untracked | 0 +| 166|0x000000045a000000, 0x000000045a800000, 0x000000045a800000|100%| O| |TAMS 0x000000045a000000| PB 0x000000045a000000| Untracked | 0 +| 167|0x000000045a800000, 0x000000045b000000, 0x000000045b000000|100%| O| |TAMS 0x000000045a800000| PB 0x000000045a800000| Untracked | 0 +| 168|0x000000045b000000, 0x000000045b800000, 0x000000045b800000|100%| O| |TAMS 0x000000045b000000| PB 0x000000045b000000| Untracked | 0 +| 169|0x000000045b800000, 0x000000045c000000, 0x000000045c000000|100%| O| |TAMS 0x000000045b800000| PB 0x000000045b800000| Untracked | 0 +| 170|0x000000045c000000, 0x000000045c800000, 0x000000045c800000|100%| O| |TAMS 0x000000045c000000| PB 0x000000045c000000| Untracked | 0 +| 171|0x000000045c800000, 0x000000045d000000, 0x000000045d000000|100%| O| |TAMS 0x000000045c800000| PB 0x000000045c800000| Untracked | 0 +| 172|0x000000045d000000, 0x000000045d800000, 0x000000045d800000|100%| O| |TAMS 0x000000045d000000| PB 0x000000045d000000| Untracked | 0 +| 173|0x000000045d800000, 0x000000045e000000, 0x000000045e000000|100%| O| |TAMS 0x000000045d800000| PB 0x000000045d800000| Untracked | 0 +| 174|0x000000045e000000, 0x000000045e800000, 0x000000045e800000|100%| O| |TAMS 0x000000045e000000| PB 0x000000045e000000| Untracked | 0 +| 175|0x000000045e800000, 0x000000045f000000, 0x000000045f000000|100%| O| |TAMS 0x000000045e800000| PB 0x000000045e800000| Untracked | 0 +| 176|0x000000045f000000, 0x000000045f800000, 0x000000045f800000|100%| O| |TAMS 0x000000045f000000| PB 0x000000045f000000| Untracked | 0 +| 177|0x000000045f800000, 0x0000000460000000, 0x0000000460000000|100%| O| |TAMS 0x000000045f800000| PB 0x000000045f800000| Untracked | 0 +| 178|0x0000000460000000, 0x0000000460800000, 0x0000000460800000|100%| O| |TAMS 0x0000000460000000| PB 0x0000000460000000| Untracked | 0 +| 179|0x0000000460800000, 0x0000000461000000, 0x0000000461000000|100%| O| |TAMS 0x0000000460800000| PB 0x0000000460800000| Untracked | 0 +| 180|0x0000000461000000, 0x0000000461800000, 0x0000000461800000|100%| O| |TAMS 0x0000000461000000| PB 0x0000000461000000| Untracked | 0 +| 181|0x0000000461800000, 0x0000000462000000, 0x0000000462000000|100%| O| |TAMS 0x0000000461800000| PB 0x0000000461800000| Untracked | 0 +| 182|0x0000000462000000, 0x0000000462800000, 0x0000000462800000|100%| O| |TAMS 0x0000000462000000| PB 0x0000000462000000| Untracked | 0 +| 183|0x0000000462800000, 0x0000000463000000, 0x0000000463000000|100%| O| |TAMS 0x0000000462800000| PB 0x0000000462800000| Untracked | 0 +| 184|0x0000000463000000, 0x0000000463800000, 0x0000000463800000|100%| O| |TAMS 0x0000000463000000| PB 0x0000000463000000| Untracked | 0 +| 185|0x0000000463800000, 0x0000000464000000, 0x0000000464000000|100%| O| |TAMS 0x0000000463800000| PB 0x0000000463800000| Untracked | 0 +| 186|0x0000000464000000, 0x0000000464800000, 0x0000000464800000|100%| O| |TAMS 0x0000000464000000| PB 0x0000000464000000| Untracked | 0 +| 187|0x0000000464800000, 0x0000000465000000, 0x0000000465000000|100%| O| |TAMS 0x0000000464800000| PB 0x0000000464800000| Untracked | 0 +| 188|0x0000000465000000, 0x0000000465800000, 0x0000000465800000|100%| O| |TAMS 0x0000000465000000| PB 0x0000000465000000| Untracked | 0 +| 189|0x0000000465800000, 0x0000000466000000, 0x0000000466000000|100%| O| |TAMS 0x0000000465800000| PB 0x0000000465800000| Untracked | 0 +| 190|0x0000000466000000, 0x0000000466800000, 0x0000000466800000|100%| O| |TAMS 0x0000000466000000| PB 0x0000000466000000| Untracked | 0 +| 191|0x0000000466800000, 0x0000000467000000, 0x0000000467000000|100%| O| |TAMS 0x0000000466800000| PB 0x0000000466800000| Untracked | 0 +| 192|0x0000000467000000, 0x0000000467800000, 0x0000000467800000|100%| O| |TAMS 0x0000000467000000| PB 0x0000000467000000| Untracked | 0 +| 193|0x0000000467800000, 0x0000000468000000, 0x0000000468000000|100%| O| |TAMS 0x0000000467800000| PB 0x0000000467800000| Untracked | 0 +| 194|0x0000000468000000, 0x0000000468800000, 0x0000000468800000|100%| O| |TAMS 0x0000000468000000| PB 0x0000000468000000| Untracked | 0 +| 195|0x0000000468800000, 0x0000000469000000, 0x0000000469000000|100%| O| |TAMS 0x0000000468800000| PB 0x0000000468800000| Untracked | 0 +| 196|0x0000000469000000, 0x0000000469800000, 0x0000000469800000|100%| O| |TAMS 0x0000000469000000| PB 0x0000000469000000| Untracked | 0 +| 197|0x0000000469800000, 0x000000046a000000, 0x000000046a000000|100%| O| |TAMS 0x0000000469800000| PB 0x0000000469800000| Untracked | 0 +| 198|0x000000046a000000, 0x000000046a800000, 0x000000046a800000|100%| O| |TAMS 0x000000046a000000| PB 0x000000046a000000| Untracked | 0 +| 199|0x000000046a800000, 0x000000046b000000, 0x000000046b000000|100%| O| |TAMS 0x000000046a800000| PB 0x000000046a800000| Untracked | 0 +| 200|0x000000046b000000, 0x000000046b800000, 0x000000046b800000|100%| O| |TAMS 0x000000046b000000| PB 0x000000046b000000| Untracked | 0 +| 201|0x000000046b800000, 0x000000046c000000, 0x000000046c000000|100%| O| |TAMS 0x000000046b800000| PB 0x000000046b800000| Untracked | 0 +| 202|0x000000046c000000, 0x000000046c800000, 0x000000046c800000|100%| O| |TAMS 0x000000046c000000| PB 0x000000046c000000| Untracked | 0 +| 203|0x000000046c800000, 0x000000046d000000, 0x000000046d000000|100%| O| |TAMS 0x000000046c800000| PB 0x000000046c800000| Untracked | 0 +| 204|0x000000046d000000, 0x000000046d800000, 0x000000046d800000|100%| O| |TAMS 0x000000046d000000| PB 0x000000046d000000| Untracked | 0 +| 205|0x000000046d800000, 0x000000046e000000, 0x000000046e000000|100%| O| |TAMS 0x000000046d800000| PB 0x000000046d800000| Untracked | 0 +| 206|0x000000046e000000, 0x000000046e800000, 0x000000046e800000|100%| O| |TAMS 0x000000046e000000| PB 0x000000046e000000| Untracked | 0 +| 207|0x000000046e800000, 0x000000046f000000, 0x000000046f000000|100%| O| |TAMS 0x000000046e800000| PB 0x000000046e800000| Untracked | 0 +| 208|0x000000046f000000, 0x000000046f800000, 0x000000046f800000|100%| O| |TAMS 0x000000046f000000| PB 0x000000046f000000| Untracked | 0 +| 209|0x000000046f800000, 0x0000000470000000, 0x0000000470000000|100%| O| |TAMS 0x000000046f800000| PB 0x000000046f800000| Untracked | 0 +| 210|0x0000000470000000, 0x0000000470800000, 0x0000000470800000|100%| O| |TAMS 0x0000000470000000| PB 0x0000000470000000| Untracked | 0 +| 211|0x0000000470800000, 0x0000000471000000, 0x0000000471000000|100%| O| |TAMS 0x0000000470800000| PB 0x0000000470800000| Untracked | 0 +| 212|0x0000000471000000, 0x0000000471800000, 0x0000000471800000|100%| O| |TAMS 0x0000000471000000| PB 0x0000000471000000| Untracked | 0 +| 213|0x0000000471800000, 0x0000000472000000, 0x0000000472000000|100%| O| |TAMS 0x0000000471800000| PB 0x0000000471800000| Untracked | 0 +| 214|0x0000000472000000, 0x0000000472800000, 0x0000000472800000|100%| O| |TAMS 0x0000000472000000| PB 0x0000000472000000| Untracked | 0 +| 215|0x0000000472800000, 0x0000000473000000, 0x0000000473000000|100%| O| |TAMS 0x0000000472800000| PB 0x0000000472800000| Untracked | 0 +| 216|0x0000000473000000, 0x0000000473800000, 0x0000000473800000|100%| O| |TAMS 0x0000000473000000| PB 0x0000000473000000| Untracked | 0 +| 217|0x0000000473800000, 0x0000000474000000, 0x0000000474000000|100%| O| |TAMS 0x0000000473800000| PB 0x0000000473800000| Untracked | 0 +| 218|0x0000000474000000, 0x0000000474800000, 0x0000000474800000|100%| O| |TAMS 0x0000000474000000| PB 0x0000000474000000| Untracked | 0 +| 219|0x0000000474800000, 0x0000000475000000, 0x0000000475000000|100%| O| |TAMS 0x0000000474800000| PB 0x0000000474800000| Untracked | 0 +| 220|0x0000000475000000, 0x0000000475800000, 0x0000000475800000|100%| O| |TAMS 0x0000000475000000| PB 0x0000000475000000| Untracked | 0 +| 221|0x0000000475800000, 0x0000000476000000, 0x0000000476000000|100%| O| |TAMS 0x0000000475800000| PB 0x0000000475800000| Untracked | 0 +| 222|0x0000000476000000, 0x0000000476800000, 0x0000000476800000|100%| O| |TAMS 0x0000000476000000| PB 0x0000000476000000| Untracked | 0 +| 223|0x0000000476800000, 0x0000000477000000, 0x0000000477000000|100%| O| |TAMS 0x0000000476800000| PB 0x0000000476800000| Untracked | 0 +| 224|0x0000000477000000, 0x0000000477800000, 0x0000000477800000|100%| O| |TAMS 0x0000000477000000| PB 0x0000000477000000| Untracked | 0 +| 225|0x0000000477800000, 0x0000000478000000, 0x0000000478000000|100%| O| |TAMS 0x0000000477800000| PB 0x0000000477800000| Untracked | 0 +| 226|0x0000000478000000, 0x0000000478800000, 0x0000000478800000|100%| O| |TAMS 0x0000000478000000| PB 0x0000000478000000| Untracked | 0 +| 227|0x0000000478800000, 0x0000000479000000, 0x0000000479000000|100%| O| |TAMS 0x0000000478800000| PB 0x0000000478800000| Untracked | 0 +| 228|0x0000000479000000, 0x0000000479800000, 0x0000000479800000|100%| O| |TAMS 0x0000000479000000| PB 0x0000000479000000| Untracked | 0 +| 229|0x0000000479800000, 0x000000047a000000, 0x000000047a000000|100%| O| |TAMS 0x0000000479800000| PB 0x0000000479800000| Untracked | 0 +| 230|0x000000047a000000, 0x000000047a800000, 0x000000047a800000|100%| O| |TAMS 0x000000047a000000| PB 0x000000047a000000| Untracked | 0 +| 231|0x000000047a800000, 0x000000047b000000, 0x000000047b000000|100%| O| |TAMS 0x000000047a800000| PB 0x000000047a800000| Untracked | 0 +| 232|0x000000047b000000, 0x000000047b800000, 0x000000047b800000|100%| O| |TAMS 0x000000047b000000| PB 0x000000047b000000| Untracked | 0 +| 233|0x000000047b800000, 0x000000047c000000, 0x000000047c000000|100%| O| |TAMS 0x000000047b800000| PB 0x000000047b800000| Untracked | 0 +| 234|0x000000047c000000, 0x000000047c800000, 0x000000047c800000|100%| O| |TAMS 0x000000047c000000| PB 0x000000047c000000| Untracked | 0 +| 235|0x000000047c800000, 0x000000047d000000, 0x000000047d000000|100%| O| |TAMS 0x000000047c800000| PB 0x000000047c800000| Untracked | 0 +| 236|0x000000047d000000, 0x000000047d800000, 0x000000047d800000|100%| O| |TAMS 0x000000047d000000| PB 0x000000047d000000| Untracked | 0 +| 237|0x000000047d800000, 0x000000047e000000, 0x000000047e000000|100%| O| |TAMS 0x000000047d800000| PB 0x000000047d800000| Untracked | 0 +| 238|0x000000047e000000, 0x000000047e800000, 0x000000047e800000|100%| O| |TAMS 0x000000047e000000| PB 0x000000047e000000| Untracked | 0 +| 239|0x000000047e800000, 0x000000047f000000, 0x000000047f000000|100%| O| |TAMS 0x000000047e800000| PB 0x000000047e800000| Untracked | 0 +| 240|0x000000047f000000, 0x000000047f800000, 0x000000047f800000|100%| O| |TAMS 0x000000047f000000| PB 0x000000047f000000| Untracked | 0 +| 241|0x000000047f800000, 0x0000000480000000, 0x0000000480000000|100%| O| |TAMS 0x000000047f800000| PB 0x000000047f800000| Untracked | 0 +| 242|0x0000000480000000, 0x0000000480800000, 0x0000000480800000|100%| O| |TAMS 0x0000000480000000| PB 0x0000000480000000| Untracked | 0 +| 243|0x0000000480800000, 0x0000000481000000, 0x0000000481000000|100%| O| |TAMS 0x0000000480800000| PB 0x0000000480800000| Untracked | 0 +| 244|0x0000000481000000, 0x0000000481800000, 0x0000000481800000|100%| O| |TAMS 0x0000000481000000| PB 0x0000000481000000| Untracked | 0 +| 245|0x0000000481800000, 0x0000000482000000, 0x0000000482000000|100%| O| |TAMS 0x0000000481800000| PB 0x0000000481800000| Untracked | 0 +| 246|0x0000000482000000, 0x0000000482800000, 0x0000000482800000|100%| O| |TAMS 0x0000000482000000| PB 0x0000000482000000| Untracked | 0 +| 247|0x0000000482800000, 0x0000000483000000, 0x0000000483000000|100%| O| |TAMS 0x0000000482800000| PB 0x0000000482800000| Untracked | 0 +| 248|0x0000000483000000, 0x0000000483800000, 0x0000000483800000|100%| O| |TAMS 0x0000000483000000| PB 0x0000000483000000| Untracked | 0 +| 249|0x0000000483800000, 0x0000000484000000, 0x0000000484000000|100%| O| |TAMS 0x0000000483800000| PB 0x0000000483800000| Untracked | 0 +| 250|0x0000000484000000, 0x0000000484800000, 0x0000000484800000|100%| O| |TAMS 0x0000000484000000| PB 0x0000000484000000| Untracked | 0 +| 251|0x0000000484800000, 0x0000000485000000, 0x0000000485000000|100%| O| |TAMS 0x0000000484800000| PB 0x0000000484800000| Untracked | 0 +| 252|0x0000000485000000, 0x0000000485800000, 0x0000000485800000|100%| O| |TAMS 0x0000000485000000| PB 0x0000000485000000| Untracked | 0 +| 253|0x0000000485800000, 0x0000000486000000, 0x0000000486000000|100%| O| |TAMS 0x0000000485800000| PB 0x0000000485800000| Untracked | 0 +| 254|0x0000000486000000, 0x0000000486800000, 0x0000000486800000|100%| O| |TAMS 0x0000000486000000| PB 0x0000000486000000| Untracked | 0 +| 255|0x0000000486800000, 0x0000000487000000, 0x0000000487000000|100%| O| |TAMS 0x0000000486800000| PB 0x0000000486800000| Untracked | 0 +| 256|0x0000000487000000, 0x0000000487800000, 0x0000000487800000|100%| O| |TAMS 0x0000000487000000| PB 0x0000000487000000| Untracked | 0 +| 257|0x0000000487800000, 0x0000000488000000, 0x0000000488000000|100%| O| |TAMS 0x0000000487800000| PB 0x0000000487800000| Untracked | 0 +| 258|0x0000000488000000, 0x0000000488800000, 0x0000000488800000|100%| O| |TAMS 0x0000000488000000| PB 0x0000000488000000| Untracked | 0 +| 259|0x0000000488800000, 0x0000000489000000, 0x0000000489000000|100%| O| |TAMS 0x0000000488800000| PB 0x0000000488800000| Untracked | 0 +| 260|0x0000000489000000, 0x0000000489800000, 0x0000000489800000|100%| O| |TAMS 0x0000000489000000| PB 0x0000000489000000| Untracked | 0 +| 261|0x0000000489800000, 0x000000048a000000, 0x000000048a000000|100%| O| |TAMS 0x0000000489800000| PB 0x0000000489800000| Untracked | 0 +| 262|0x000000048a000000, 0x000000048a800000, 0x000000048a800000|100%| O| |TAMS 0x000000048a000000| PB 0x000000048a000000| Untracked | 0 +| 263|0x000000048a800000, 0x000000048b000000, 0x000000048b000000|100%| O| |TAMS 0x000000048a800000| PB 0x000000048a800000| Untracked | 0 +| 264|0x000000048b000000, 0x000000048b800000, 0x000000048b800000|100%| O| |TAMS 0x000000048b000000| PB 0x000000048b000000| Untracked | 0 +| 265|0x000000048b800000, 0x000000048c000000, 0x000000048c000000|100%| O| |TAMS 0x000000048b800000| PB 0x000000048b800000| Untracked | 0 +| 266|0x000000048c000000, 0x000000048c800000, 0x000000048c800000|100%| O| |TAMS 0x000000048c000000| PB 0x000000048c000000| Untracked | 0 +| 267|0x000000048c800000, 0x000000048d000000, 0x000000048d000000|100%| O| |TAMS 0x000000048c800000| PB 0x000000048c800000| Untracked | 0 +| 268|0x000000048d000000, 0x000000048d800000, 0x000000048d800000|100%| O| |TAMS 0x000000048d000000| PB 0x000000048d000000| Untracked | 0 +| 269|0x000000048d800000, 0x000000048e000000, 0x000000048e000000|100%| O| |TAMS 0x000000048d800000| PB 0x000000048d800000| Untracked | 0 +| 270|0x000000048e000000, 0x000000048e800000, 0x000000048e800000|100%| O| |TAMS 0x000000048e000000| PB 0x000000048e000000| Untracked | 0 +| 271|0x000000048e800000, 0x000000048f000000, 0x000000048f000000|100%| O| |TAMS 0x000000048e800000| PB 0x000000048e800000| Untracked | 0 +| 272|0x000000048f000000, 0x000000048f800000, 0x000000048f800000|100%| O| |TAMS 0x000000048f000000| PB 0x000000048f000000| Untracked | 0 +| 273|0x000000048f800000, 0x0000000490000000, 0x0000000490000000|100%| O| |TAMS 0x000000048f800000| PB 0x000000048f800000| Untracked | 0 +| 274|0x0000000490000000, 0x0000000490800000, 0x0000000490800000|100%| O| |TAMS 0x0000000490000000| PB 0x0000000490000000| Untracked | 0 +| 275|0x0000000490800000, 0x0000000491000000, 0x0000000491000000|100%| O| |TAMS 0x0000000490800000| PB 0x0000000490800000| Untracked | 0 +| 276|0x0000000491000000, 0x0000000491800000, 0x0000000491800000|100%| O| |TAMS 0x0000000491000000| PB 0x0000000491000000| Untracked | 0 +| 277|0x0000000491800000, 0x0000000492000000, 0x0000000492000000|100%| O| |TAMS 0x0000000491800000| PB 0x0000000491800000| Untracked | 0 +| 278|0x0000000492000000, 0x0000000492800000, 0x0000000492800000|100%| O| |TAMS 0x0000000492000000| PB 0x0000000492000000| Untracked | 0 +| 279|0x0000000492800000, 0x0000000493000000, 0x0000000493000000|100%| O| |TAMS 0x0000000492800000| PB 0x0000000492800000| Untracked | 0 +| 280|0x0000000493000000, 0x0000000493800000, 0x0000000493800000|100%| O| |TAMS 0x0000000493000000| PB 0x0000000493000000| Untracked | 0 +| 281|0x0000000493800000, 0x0000000494000000, 0x0000000494000000|100%| O| |TAMS 0x0000000493800000| PB 0x0000000493800000| Untracked | 0 +| 282|0x0000000494000000, 0x0000000494800000, 0x0000000494800000|100%| O| |TAMS 0x0000000494000000| PB 0x0000000494000000| Untracked | 0 +| 283|0x0000000494800000, 0x0000000495000000, 0x0000000495000000|100%| O| |TAMS 0x0000000494800000| PB 0x0000000494800000| Untracked | 0 +| 284|0x0000000495000000, 0x0000000495800000, 0x0000000495800000|100%| O| |TAMS 0x0000000495000000| PB 0x0000000495000000| Untracked | 0 +| 285|0x0000000495800000, 0x0000000496000000, 0x0000000496000000|100%| O| |TAMS 0x0000000495800000| PB 0x0000000495800000| Untracked | 0 +| 286|0x0000000496000000, 0x0000000496800000, 0x0000000496800000|100%| O| |TAMS 0x0000000496000000| PB 0x0000000496000000| Untracked | 0 +| 287|0x0000000496800000, 0x0000000497000000, 0x0000000497000000|100%| O| |TAMS 0x0000000496800000| PB 0x0000000496800000| Untracked | 0 +| 288|0x0000000497000000, 0x0000000497800000, 0x0000000497800000|100%| O| |TAMS 0x0000000497000000| PB 0x0000000497000000| Untracked | 0 +| 289|0x0000000497800000, 0x0000000498000000, 0x0000000498000000|100%| O| |TAMS 0x0000000497800000| PB 0x0000000497800000| Untracked | 0 +| 290|0x0000000498000000, 0x0000000498800000, 0x0000000498800000|100%| O| |TAMS 0x0000000498000000| PB 0x0000000498000000| Untracked | 0 +| 291|0x0000000498800000, 0x0000000499000000, 0x0000000499000000|100%| O| |TAMS 0x0000000498800000| PB 0x0000000498800000| Untracked | 0 +| 292|0x0000000499000000, 0x0000000499800000, 0x0000000499800000|100%| O| |TAMS 0x0000000499000000| PB 0x0000000499000000| Untracked | 0 +| 293|0x0000000499800000, 0x000000049a000000, 0x000000049a000000|100%| O| |TAMS 0x0000000499800000| PB 0x0000000499800000| Untracked | 0 +| 294|0x000000049a000000, 0x000000049a800000, 0x000000049a800000|100%| O| |TAMS 0x000000049a000000| PB 0x000000049a000000| Untracked | 0 +| 295|0x000000049a800000, 0x000000049b000000, 0x000000049b000000|100%| O| |TAMS 0x000000049a800000| PB 0x000000049a800000| Untracked | 0 +| 296|0x000000049b000000, 0x000000049b800000, 0x000000049b800000|100%| O| |TAMS 0x000000049b000000| PB 0x000000049b000000| Untracked | 0 +| 297|0x000000049b800000, 0x000000049c000000, 0x000000049c000000|100%| O| |TAMS 0x000000049b800000| PB 0x000000049b800000| Untracked | 0 +| 298|0x000000049c000000, 0x000000049c800000, 0x000000049c800000|100%| O| |TAMS 0x000000049c000000| PB 0x000000049c000000| Untracked | 0 +| 299|0x000000049c800000, 0x000000049d000000, 0x000000049d000000|100%| O| |TAMS 0x000000049c800000| PB 0x000000049c800000| Untracked | 0 +| 300|0x000000049d000000, 0x000000049d800000, 0x000000049d800000|100%| O| |TAMS 0x000000049d000000| PB 0x000000049d000000| Untracked | 0 +| 301|0x000000049d800000, 0x000000049e000000, 0x000000049e000000|100%| O| |TAMS 0x000000049d800000| PB 0x000000049d800000| Untracked | 0 +| 302|0x000000049e000000, 0x000000049e800000, 0x000000049e800000|100%| O| |TAMS 0x000000049e000000| PB 0x000000049e000000| Untracked | 0 +| 303|0x000000049e800000, 0x000000049f000000, 0x000000049f000000|100%| O| |TAMS 0x000000049e800000| PB 0x000000049e800000| Untracked | 0 +| 304|0x000000049f000000, 0x000000049f800000, 0x000000049f800000|100%| O| |TAMS 0x000000049f000000| PB 0x000000049f000000| Untracked | 0 +| 305|0x000000049f800000, 0x00000004a0000000, 0x00000004a0000000|100%| O| |TAMS 0x000000049f800000| PB 0x000000049f800000| Untracked | 0 +| 306|0x00000004a0000000, 0x00000004a0800000, 0x00000004a0800000|100%| O| |TAMS 0x00000004a0000000| PB 0x00000004a0000000| Untracked | 0 +| 307|0x00000004a0800000, 0x00000004a1000000, 0x00000004a1000000|100%| O| |TAMS 0x00000004a0800000| PB 0x00000004a0800000| Untracked | 0 +| 308|0x00000004a1000000, 0x00000004a1800000, 0x00000004a1800000|100%| O| |TAMS 0x00000004a1000000| PB 0x00000004a1000000| Untracked | 0 +| 309|0x00000004a1800000, 0x00000004a2000000, 0x00000004a2000000|100%| O| |TAMS 0x00000004a1800000| PB 0x00000004a1800000| Untracked | 0 +| 310|0x00000004a2000000, 0x00000004a2800000, 0x00000004a2800000|100%| O| |TAMS 0x00000004a2000000| PB 0x00000004a2000000| Untracked | 0 +| 311|0x00000004a2800000, 0x00000004a3000000, 0x00000004a3000000|100%| O| |TAMS 0x00000004a2800000| PB 0x00000004a2800000| Untracked | 0 +| 312|0x00000004a3000000, 0x00000004a3800000, 0x00000004a3800000|100%| O| |TAMS 0x00000004a3000000| PB 0x00000004a3000000| Untracked | 0 +| 313|0x00000004a3800000, 0x00000004a4000000, 0x00000004a4000000|100%| O| |TAMS 0x00000004a3800000| PB 0x00000004a3800000| Untracked | 0 +| 314|0x00000004a4000000, 0x00000004a4800000, 0x00000004a4800000|100%| O| |TAMS 0x00000004a4000000| PB 0x00000004a4000000| Untracked | 0 +| 315|0x00000004a4800000, 0x00000004a5000000, 0x00000004a5000000|100%| O| |TAMS 0x00000004a4800000| PB 0x00000004a4800000| Untracked | 0 +| 316|0x00000004a5000000, 0x00000004a5800000, 0x00000004a5800000|100%| O| |TAMS 0x00000004a5000000| PB 0x00000004a5000000| Untracked | 0 +| 317|0x00000004a5800000, 0x00000004a6000000, 0x00000004a6000000|100%| O| |TAMS 0x00000004a5800000| PB 0x00000004a5800000| Untracked | 0 +| 318|0x00000004a6000000, 0x00000004a6800000, 0x00000004a6800000|100%| O| |TAMS 0x00000004a6000000| PB 0x00000004a6000000| Untracked | 0 +| 319|0x00000004a6800000, 0x00000004a7000000, 0x00000004a7000000|100%| O| |TAMS 0x00000004a6800000| PB 0x00000004a6800000| Untracked | 0 +| 320|0x00000004a7000000, 0x00000004a7800000, 0x00000004a7800000|100%| O| |TAMS 0x00000004a7000000| PB 0x00000004a7000000| Untracked | 0 +| 321|0x00000004a7800000, 0x00000004a8000000, 0x00000004a8000000|100%| O| |TAMS 0x00000004a7800000| PB 0x00000004a7800000| Untracked | 0 +| 322|0x00000004a8000000, 0x00000004a8800000, 0x00000004a8800000|100%| O| |TAMS 0x00000004a8000000| PB 0x00000004a8000000| Untracked | 0 +| 323|0x00000004a8800000, 0x00000004a9000000, 0x00000004a9000000|100%| O| |TAMS 0x00000004a8800000| PB 0x00000004a8800000| Untracked | 0 +| 324|0x00000004a9000000, 0x00000004a9800000, 0x00000004a9800000|100%| O| |TAMS 0x00000004a9000000| PB 0x00000004a9000000| Untracked | 0 +| 325|0x00000004a9800000, 0x00000004aa000000, 0x00000004aa000000|100%| O| |TAMS 0x00000004a9800000| PB 0x00000004a9800000| Untracked | 0 +| 326|0x00000004aa000000, 0x00000004aa800000, 0x00000004aa800000|100%| O| |TAMS 0x00000004aa000000| PB 0x00000004aa000000| Untracked | 0 +| 327|0x00000004aa800000, 0x00000004ab000000, 0x00000004ab000000|100%| O| |TAMS 0x00000004aa800000| PB 0x00000004aa800000| Untracked | 0 +| 328|0x00000004ab000000, 0x00000004ab800000, 0x00000004ab800000|100%| O| |TAMS 0x00000004ab000000| PB 0x00000004ab000000| Untracked | 0 +| 329|0x00000004ab800000, 0x00000004ac000000, 0x00000004ac000000|100%| O| |TAMS 0x00000004ab800000| PB 0x00000004ab800000| Untracked | 0 +| 330|0x00000004ac000000, 0x00000004ac800000, 0x00000004ac800000|100%| O| |TAMS 0x00000004ac000000| PB 0x00000004ac000000| Untracked | 0 +| 331|0x00000004ac800000, 0x00000004ad000000, 0x00000004ad000000|100%| O| |TAMS 0x00000004ac800000| PB 0x00000004ac800000| Untracked | 0 +| 332|0x00000004ad000000, 0x00000004ad800000, 0x00000004ad800000|100%| O| |TAMS 0x00000004ad000000| PB 0x00000004ad000000| Untracked | 0 +| 333|0x00000004ad800000, 0x00000004ae000000, 0x00000004ae000000|100%| O| |TAMS 0x00000004ad800000| PB 0x00000004ad800000| Untracked | 0 +| 334|0x00000004ae000000, 0x00000004ae800000, 0x00000004ae800000|100%| O| |TAMS 0x00000004ae000000| PB 0x00000004ae000000| Untracked | 0 +| 335|0x00000004ae800000, 0x00000004af000000, 0x00000004af000000|100%| O| |TAMS 0x00000004ae800000| PB 0x00000004ae800000| Untracked | 0 +| 336|0x00000004af000000, 0x00000004af800000, 0x00000004af800000|100%| O| |TAMS 0x00000004af000000| PB 0x00000004af000000| Untracked | 0 +| 337|0x00000004af800000, 0x00000004b0000000, 0x00000004b0000000|100%| O| |TAMS 0x00000004af800000| PB 0x00000004af800000| Untracked | 0 +| 338|0x00000004b0000000, 0x00000004b0800000, 0x00000004b0800000|100%| O| |TAMS 0x00000004b0000000| PB 0x00000004b0000000| Untracked | 0 +| 339|0x00000004b0800000, 0x00000004b1000000, 0x00000004b1000000|100%| O| |TAMS 0x00000004b0800000| PB 0x00000004b0800000| Untracked | 0 +| 340|0x00000004b1000000, 0x00000004b1800000, 0x00000004b1800000|100%| O| |TAMS 0x00000004b1000000| PB 0x00000004b1000000| Untracked | 0 +| 341|0x00000004b1800000, 0x00000004b2000000, 0x00000004b2000000|100%| O| |TAMS 0x00000004b1800000| PB 0x00000004b1800000| Untracked | 0 +| 342|0x00000004b2000000, 0x00000004b2800000, 0x00000004b2800000|100%| O| |TAMS 0x00000004b2000000| PB 0x00000004b2000000| Untracked | 0 +| 343|0x00000004b2800000, 0x00000004b3000000, 0x00000004b3000000|100%| O| |TAMS 0x00000004b2800000| PB 0x00000004b2800000| Untracked | 0 +| 344|0x00000004b3000000, 0x00000004b3800000, 0x00000004b3800000|100%| O| |TAMS 0x00000004b3000000| PB 0x00000004b3000000| Untracked | 0 +| 345|0x00000004b3800000, 0x00000004b4000000, 0x00000004b4000000|100%| O| |TAMS 0x00000004b3800000| PB 0x00000004b3800000| Untracked | 0 +| 346|0x00000004b4000000, 0x00000004b4800000, 0x00000004b4800000|100%| O| |TAMS 0x00000004b4000000| PB 0x00000004b4000000| Untracked | 0 +| 347|0x00000004b4800000, 0x00000004b5000000, 0x00000004b5000000|100%| O| |TAMS 0x00000004b4800000| PB 0x00000004b4800000| Untracked | 0 +| 348|0x00000004b5000000, 0x00000004b5800000, 0x00000004b5800000|100%| O| |TAMS 0x00000004b5000000| PB 0x00000004b5000000| Untracked | 0 +| 349|0x00000004b5800000, 0x00000004b6000000, 0x00000004b6000000|100%| O| |TAMS 0x00000004b5800000| PB 0x00000004b5800000| Untracked | 0 +| 350|0x00000004b6000000, 0x00000004b6800000, 0x00000004b6800000|100%| O| |TAMS 0x00000004b6000000| PB 0x00000004b6000000| Untracked | 0 +| 351|0x00000004b6800000, 0x00000004b7000000, 0x00000004b7000000|100%| O| |TAMS 0x00000004b6800000| PB 0x00000004b6800000| Untracked | 0 +| 352|0x00000004b7000000, 0x00000004b7800000, 0x00000004b7800000|100%| O| |TAMS 0x00000004b7000000| PB 0x00000004b7000000| Untracked | 0 +| 353|0x00000004b7800000, 0x00000004b8000000, 0x00000004b8000000|100%| O| |TAMS 0x00000004b7800000| PB 0x00000004b7800000| Untracked | 0 +| 354|0x00000004b8000000, 0x00000004b8800000, 0x00000004b8800000|100%| O| |TAMS 0x00000004b8000000| PB 0x00000004b8000000| Untracked | 0 +| 355|0x00000004b8800000, 0x00000004b9000000, 0x00000004b9000000|100%| O| |TAMS 0x00000004b8800000| PB 0x00000004b8800000| Untracked | 0 +| 356|0x00000004b9000000, 0x00000004b9800000, 0x00000004b9800000|100%| O| |TAMS 0x00000004b9000000| PB 0x00000004b9000000| Untracked | 0 +| 357|0x00000004b9800000, 0x00000004ba000000, 0x00000004ba000000|100%| O| |TAMS 0x00000004b9800000| PB 0x00000004b9800000| Untracked | 0 +| 358|0x00000004ba000000, 0x00000004ba800000, 0x00000004ba800000|100%| O| |TAMS 0x00000004ba000000| PB 0x00000004ba000000| Untracked | 0 +| 359|0x00000004ba800000, 0x00000004bb000000, 0x00000004bb000000|100%| O| |TAMS 0x00000004ba800000| PB 0x00000004ba800000| Untracked | 0 +| 360|0x00000004bb000000, 0x00000004bb800000, 0x00000004bb800000|100%| O| |TAMS 0x00000004bb000000| PB 0x00000004bb000000| Untracked | 0 +| 361|0x00000004bb800000, 0x00000004bc000000, 0x00000004bc000000|100%| O| |TAMS 0x00000004bb800000| PB 0x00000004bb800000| Untracked | 0 +| 362|0x00000004bc000000, 0x00000004bc800000, 0x00000004bc800000|100%| O| |TAMS 0x00000004bc000000| PB 0x00000004bc000000| Untracked | 0 +| 363|0x00000004bc800000, 0x00000004bd000000, 0x00000004bd000000|100%| O| |TAMS 0x00000004bc800000| PB 0x00000004bc800000| Untracked | 0 +| 364|0x00000004bd000000, 0x00000004bd800000, 0x00000004bd800000|100%| O| |TAMS 0x00000004bd000000| PB 0x00000004bd000000| Untracked | 0 +| 365|0x00000004bd800000, 0x00000004be000000, 0x00000004be000000|100%| O| |TAMS 0x00000004bd800000| PB 0x00000004bd800000| Untracked | 0 +| 366|0x00000004be000000, 0x00000004be800000, 0x00000004be800000|100%| O| |TAMS 0x00000004be000000| PB 0x00000004be000000| Untracked | 0 +| 367|0x00000004be800000, 0x00000004bf000000, 0x00000004bf000000|100%| O| |TAMS 0x00000004be800000| PB 0x00000004be800000| Untracked | 0 +| 368|0x00000004bf000000, 0x00000004bf800000, 0x00000004bf800000|100%| O| |TAMS 0x00000004bf000000| PB 0x00000004bf000000| Untracked | 0 +| 369|0x00000004bf800000, 0x00000004c0000000, 0x00000004c0000000|100%| O| |TAMS 0x00000004bf800000| PB 0x00000004bf800000| Untracked | 0 +| 370|0x00000004c0000000, 0x00000004c0800000, 0x00000004c0800000|100%| O| |TAMS 0x00000004c0000000| PB 0x00000004c0000000| Untracked | 0 +| 371|0x00000004c0800000, 0x00000004c1000000, 0x00000004c1000000|100%| O| |TAMS 0x00000004c0800000| PB 0x00000004c0800000| Untracked | 0 +| 372|0x00000004c1000000, 0x00000004c1800000, 0x00000004c1800000|100%| O| |TAMS 0x00000004c1000000| PB 0x00000004c1000000| Untracked | 0 +| 373|0x00000004c1800000, 0x00000004c2000000, 0x00000004c2000000|100%| O| |TAMS 0x00000004c1800000| PB 0x00000004c1800000| Untracked | 0 +| 374|0x00000004c2000000, 0x00000004c2800000, 0x00000004c2800000|100%| O| |TAMS 0x00000004c2000000| PB 0x00000004c2000000| Untracked | 0 +| 375|0x00000004c2800000, 0x00000004c3000000, 0x00000004c3000000|100%| O| |TAMS 0x00000004c2800000| PB 0x00000004c2800000| Untracked | 0 +| 376|0x00000004c3000000, 0x00000004c3800000, 0x00000004c3800000|100%| O| |TAMS 0x00000004c3000000| PB 0x00000004c3000000| Untracked | 0 +| 377|0x00000004c3800000, 0x00000004c4000000, 0x00000004c4000000|100%| O| |TAMS 0x00000004c3800000| PB 0x00000004c3800000| Untracked | 0 +| 378|0x00000004c4000000, 0x00000004c4800000, 0x00000004c4800000|100%| O| |TAMS 0x00000004c4000000| PB 0x00000004c4000000| Untracked | 0 +| 379|0x00000004c4800000, 0x00000004c5000000, 0x00000004c5000000|100%| O| |TAMS 0x00000004c4800000| PB 0x00000004c4800000| Untracked | 0 +| 380|0x00000004c5000000, 0x00000004c5800000, 0x00000004c5800000|100%| O| |TAMS 0x00000004c5000000| PB 0x00000004c5000000| Untracked | 0 +| 381|0x00000004c5800000, 0x00000004c6000000, 0x00000004c6000000|100%| O| |TAMS 0x00000004c5800000| PB 0x00000004c5800000| Untracked | 0 +| 382|0x00000004c6000000, 0x00000004c6800000, 0x00000004c6800000|100%| O| |TAMS 0x00000004c6000000| PB 0x00000004c6000000| Untracked | 0 +| 383|0x00000004c6800000, 0x00000004c7000000, 0x00000004c7000000|100%| O| |TAMS 0x00000004c6800000| PB 0x00000004c6800000| Untracked | 0 +| 384|0x00000004c7000000, 0x00000004c7800000, 0x00000004c7800000|100%| O| |TAMS 0x00000004c7000000| PB 0x00000004c7000000| Untracked | 0 +| 385|0x00000004c7800000, 0x00000004c8000000, 0x00000004c8000000|100%| O| |TAMS 0x00000004c7800000| PB 0x00000004c7800000| Untracked | 0 +| 386|0x00000004c8000000, 0x00000004c8800000, 0x00000004c8800000|100%| O| |TAMS 0x00000004c8000000| PB 0x00000004c8000000| Untracked | 0 +| 387|0x00000004c8800000, 0x00000004c9000000, 0x00000004c9000000|100%| O| |TAMS 0x00000004c8800000| PB 0x00000004c8800000| Untracked | 0 +| 388|0x00000004c9000000, 0x00000004c9800000, 0x00000004c9800000|100%| O| |TAMS 0x00000004c9000000| PB 0x00000004c9000000| Untracked | 0 +| 389|0x00000004c9800000, 0x00000004ca000000, 0x00000004ca000000|100%| O| |TAMS 0x00000004c9800000| PB 0x00000004c9800000| Untracked | 0 +| 390|0x00000004ca000000, 0x00000004ca800000, 0x00000004ca800000|100%| O| |TAMS 0x00000004ca000000| PB 0x00000004ca000000| Untracked | 0 +| 391|0x00000004ca800000, 0x00000004cb000000, 0x00000004cb000000|100%| O| |TAMS 0x00000004ca800000| PB 0x00000004ca800000| Untracked | 0 +| 392|0x00000004cb000000, 0x00000004cb800000, 0x00000004cb800000|100%| O| |TAMS 0x00000004cb000000| PB 0x00000004cb000000| Untracked | 0 +| 393|0x00000004cb800000, 0x00000004cc000000, 0x00000004cc000000|100%| O| |TAMS 0x00000004cb800000| PB 0x00000004cb800000| Untracked | 0 +| 394|0x00000004cc000000, 0x00000004cc800000, 0x00000004cc800000|100%| O| |TAMS 0x00000004cc000000| PB 0x00000004cc000000| Untracked | 0 +| 395|0x00000004cc800000, 0x00000004cd000000, 0x00000004cd000000|100%| O| |TAMS 0x00000004cc800000| PB 0x00000004cc800000| Untracked | 0 +| 396|0x00000004cd000000, 0x00000004cd800000, 0x00000004cd800000|100%| O| |TAMS 0x00000004cd000000| PB 0x00000004cd000000| Untracked | 0 +| 397|0x00000004cd800000, 0x00000004ce000000, 0x00000004ce000000|100%| O| |TAMS 0x00000004cd800000| PB 0x00000004cd800000| Untracked | 0 +| 398|0x00000004ce000000, 0x00000004ce800000, 0x00000004ce800000|100%| O| |TAMS 0x00000004ce000000| PB 0x00000004ce000000| Untracked | 0 +| 399|0x00000004ce800000, 0x00000004cf000000, 0x00000004cf000000|100%| O| |TAMS 0x00000004ce800000| PB 0x00000004ce800000| Untracked | 0 +| 400|0x00000004cf000000, 0x00000004cf800000, 0x00000004cf800000|100%| O| |TAMS 0x00000004cf000000| PB 0x00000004cf000000| Untracked | 0 +| 401|0x00000004cf800000, 0x00000004d0000000, 0x00000004d0000000|100%| O| |TAMS 0x00000004cf800000| PB 0x00000004cf800000| Untracked | 0 +| 402|0x00000004d0000000, 0x00000004d0800000, 0x00000004d0800000|100%| O| |TAMS 0x00000004d0000000| PB 0x00000004d0000000| Untracked | 0 +| 403|0x00000004d0800000, 0x00000004d1000000, 0x00000004d1000000|100%| O| |TAMS 0x00000004d0800000| PB 0x00000004d0800000| Untracked | 0 +| 404|0x00000004d1000000, 0x00000004d1800000, 0x00000004d1800000|100%| O| |TAMS 0x00000004d1000000| PB 0x00000004d1000000| Untracked | 0 +| 405|0x00000004d1800000, 0x00000004d2000000, 0x00000004d2000000|100%| O| |TAMS 0x00000004d1800000| PB 0x00000004d1800000| Untracked | 0 +| 406|0x00000004d2000000, 0x00000004d2800000, 0x00000004d2800000|100%| O| |TAMS 0x00000004d2000000| PB 0x00000004d2000000| Untracked | 0 +| 407|0x00000004d2800000, 0x00000004d3000000, 0x00000004d3000000|100%| O| |TAMS 0x00000004d2800000| PB 0x00000004d2800000| Untracked | 0 +| 408|0x00000004d3000000, 0x00000004d3800000, 0x00000004d3800000|100%| O| |TAMS 0x00000004d3000000| PB 0x00000004d3000000| Untracked | 0 +| 409|0x00000004d3800000, 0x00000004d4000000, 0x00000004d4000000|100%| O| |TAMS 0x00000004d3800000| PB 0x00000004d3800000| Untracked | 0 +| 410|0x00000004d4000000, 0x00000004d4800000, 0x00000004d4800000|100%| O| |TAMS 0x00000004d4000000| PB 0x00000004d4000000| Untracked | 0 +| 411|0x00000004d4800000, 0x00000004d5000000, 0x00000004d5000000|100%| O| |TAMS 0x00000004d4800000| PB 0x00000004d4800000| Untracked | 0 +| 412|0x00000004d5000000, 0x00000004d5800000, 0x00000004d5800000|100%| O| |TAMS 0x00000004d5000000| PB 0x00000004d5000000| Untracked | 0 +| 413|0x00000004d5800000, 0x00000004d6000000, 0x00000004d6000000|100%| O| |TAMS 0x00000004d5800000| PB 0x00000004d5800000| Untracked | 0 +| 414|0x00000004d6000000, 0x00000004d6800000, 0x00000004d6800000|100%| O| |TAMS 0x00000004d6000000| PB 0x00000004d6000000| Untracked | 0 +| 415|0x00000004d6800000, 0x00000004d7000000, 0x00000004d7000000|100%| O| |TAMS 0x00000004d6800000| PB 0x00000004d6800000| Untracked | 0 +| 416|0x00000004d7000000, 0x00000004d7800000, 0x00000004d7800000|100%| O| |TAMS 0x00000004d7000000| PB 0x00000004d7000000| Untracked | 0 +| 417|0x00000004d7800000, 0x00000004d8000000, 0x00000004d8000000|100%| O| |TAMS 0x00000004d7800000| PB 0x00000004d7800000| Untracked | 0 +| 418|0x00000004d8000000, 0x00000004d8800000, 0x00000004d8800000|100%| O| |TAMS 0x00000004d8000000| PB 0x00000004d8000000| Untracked | 0 +| 419|0x00000004d8800000, 0x00000004d9000000, 0x00000004d9000000|100%| O| |TAMS 0x00000004d8800000| PB 0x00000004d8800000| Untracked | 0 +| 420|0x00000004d9000000, 0x00000004d9800000, 0x00000004d9800000|100%| O| |TAMS 0x00000004d9000000| PB 0x00000004d9000000| Untracked | 0 +| 421|0x00000004d9800000, 0x00000004da000000, 0x00000004da000000|100%| O| |TAMS 0x00000004d9800000| PB 0x00000004d9800000| Untracked | 0 +| 422|0x00000004da000000, 0x00000004da800000, 0x00000004da800000|100%| O| |TAMS 0x00000004da000000| PB 0x00000004da000000| Untracked | 0 +| 423|0x00000004da800000, 0x00000004db000000, 0x00000004db000000|100%| O| |TAMS 0x00000004da800000| PB 0x00000004da800000| Untracked | 0 +| 424|0x00000004db000000, 0x00000004db800000, 0x00000004db800000|100%| O| |TAMS 0x00000004db000000| PB 0x00000004db000000| Untracked | 0 +| 425|0x00000004db800000, 0x00000004dc000000, 0x00000004dc000000|100%| O| |TAMS 0x00000004db800000| PB 0x00000004db800000| Untracked | 0 +| 426|0x00000004dc000000, 0x00000004dc800000, 0x00000004dc800000|100%| O| |TAMS 0x00000004dc000000| PB 0x00000004dc000000| Untracked | 0 +| 427|0x00000004dc800000, 0x00000004dd000000, 0x00000004dd000000|100%| O| |TAMS 0x00000004dc800000| PB 0x00000004dc800000| Untracked | 0 +| 428|0x00000004dd000000, 0x00000004dd800000, 0x00000004dd800000|100%| O| |TAMS 0x00000004dd000000| PB 0x00000004dd000000| Untracked | 0 +| 429|0x00000004dd800000, 0x00000004de000000, 0x00000004de000000|100%| O| |TAMS 0x00000004dd800000| PB 0x00000004dd800000| Untracked | 0 +| 430|0x00000004de000000, 0x00000004de800000, 0x00000004de800000|100%| O| |TAMS 0x00000004de000000| PB 0x00000004de000000| Untracked | 0 +| 431|0x00000004de800000, 0x00000004df000000, 0x00000004df000000|100%| O| |TAMS 0x00000004de800000| PB 0x00000004de800000| Untracked | 0 +| 432|0x00000004df000000, 0x00000004df800000, 0x00000004df800000|100%| O| |TAMS 0x00000004df000000| PB 0x00000004df000000| Untracked | 0 +| 433|0x00000004df800000, 0x00000004e0000000, 0x00000004e0000000|100%| O| |TAMS 0x00000004df800000| PB 0x00000004df800000| Untracked | 0 +| 434|0x00000004e0000000, 0x00000004e0800000, 0x00000004e0800000|100%| O| |TAMS 0x00000004e0000000| PB 0x00000004e0000000| Untracked | 0 +| 435|0x00000004e0800000, 0x00000004e1000000, 0x00000004e1000000|100%| O| |TAMS 0x00000004e0800000| PB 0x00000004e0800000| Untracked | 0 +| 436|0x00000004e1000000, 0x00000004e1800000, 0x00000004e1800000|100%| O| |TAMS 0x00000004e1000000| PB 0x00000004e1000000| Untracked | 0 +| 437|0x00000004e1800000, 0x00000004e2000000, 0x00000004e2000000|100%| O| |TAMS 0x00000004e1800000| PB 0x00000004e1800000| Untracked | 0 +| 438|0x00000004e2000000, 0x00000004e2800000, 0x00000004e2800000|100%| O| |TAMS 0x00000004e2000000| PB 0x00000004e2000000| Untracked | 0 +| 439|0x00000004e2800000, 0x00000004e3000000, 0x00000004e3000000|100%| O| |TAMS 0x00000004e2800000| PB 0x00000004e2800000| Untracked | 0 +| 440|0x00000004e3000000, 0x00000004e3800000, 0x00000004e3800000|100%| O| |TAMS 0x00000004e3000000| PB 0x00000004e3000000| Untracked | 0 +| 441|0x00000004e3800000, 0x00000004e4000000, 0x00000004e4000000|100%| O| |TAMS 0x00000004e3800000| PB 0x00000004e3800000| Untracked | 0 +| 442|0x00000004e4000000, 0x00000004e4800000, 0x00000004e4800000|100%| O| |TAMS 0x00000004e4000000| PB 0x00000004e4000000| Untracked | 0 +| 443|0x00000004e4800000, 0x00000004e5000000, 0x00000004e5000000|100%| O| |TAMS 0x00000004e4800000| PB 0x00000004e4800000| Untracked | 0 +| 444|0x00000004e5000000, 0x00000004e5800000, 0x00000004e5800000|100%| O| |TAMS 0x00000004e5000000| PB 0x00000004e5000000| Untracked | 0 +| 445|0x00000004e5800000, 0x00000004e6000000, 0x00000004e6000000|100%| O| |TAMS 0x00000004e5800000| PB 0x00000004e5800000| Untracked | 0 +| 446|0x00000004e6000000, 0x00000004e6800000, 0x00000004e6800000|100%| O| |TAMS 0x00000004e6000000| PB 0x00000004e6000000| Untracked | 0 +| 447|0x00000004e6800000, 0x00000004e7000000, 0x00000004e7000000|100%| O| |TAMS 0x00000004e6800000| PB 0x00000004e6800000| Untracked | 0 +| 448|0x00000004e7000000, 0x00000004e7800000, 0x00000004e7800000|100%| O| |TAMS 0x00000004e7000000| PB 0x00000004e7000000| Untracked | 0 +| 449|0x00000004e7800000, 0x00000004e8000000, 0x00000004e8000000|100%| O| |TAMS 0x00000004e7800000| PB 0x00000004e7800000| Untracked | 0 +| 450|0x00000004e8000000, 0x00000004e8800000, 0x00000004e8800000|100%| O| |TAMS 0x00000004e8000000| PB 0x00000004e8000000| Untracked | 0 +| 451|0x00000004e8800000, 0x00000004e9000000, 0x00000004e9000000|100%| O| |TAMS 0x00000004e8800000| PB 0x00000004e8800000| Untracked | 0 +| 452|0x00000004e9000000, 0x00000004e9800000, 0x00000004e9800000|100%| O| |TAMS 0x00000004e9000000| PB 0x00000004e9000000| Untracked | 0 +| 453|0x00000004e9800000, 0x00000004ea000000, 0x00000004ea000000|100%| O| |TAMS 0x00000004e9800000| PB 0x00000004e9800000| Untracked | 0 +| 454|0x00000004ea000000, 0x00000004ea800000, 0x00000004ea800000|100%| O| |TAMS 0x00000004ea000000| PB 0x00000004ea000000| Untracked | 0 +| 455|0x00000004ea800000, 0x00000004eb000000, 0x00000004eb000000|100%| O| |TAMS 0x00000004ea800000| PB 0x00000004ea800000| Untracked | 0 +| 456|0x00000004eb000000, 0x00000004eb800000, 0x00000004eb800000|100%| O| |TAMS 0x00000004eb000000| PB 0x00000004eb000000| Untracked | 0 +| 457|0x00000004eb800000, 0x00000004ec000000, 0x00000004ec000000|100%| O| |TAMS 0x00000004eb800000| PB 0x00000004eb800000| Untracked | 0 +| 458|0x00000004ec000000, 0x00000004ec800000, 0x00000004ec800000|100%| O| |TAMS 0x00000004ec000000| PB 0x00000004ec000000| Untracked | 0 +| 459|0x00000004ec800000, 0x00000004ed000000, 0x00000004ed000000|100%| O| |TAMS 0x00000004ec800000| PB 0x00000004ec800000| Untracked | 0 +| 460|0x00000004ed000000, 0x00000004ed800000, 0x00000004ed800000|100%| O| |TAMS 0x00000004ed000000| PB 0x00000004ed000000| Untracked | 0 +| 461|0x00000004ed800000, 0x00000004ee000000, 0x00000004ee000000|100%| O| |TAMS 0x00000004ed800000| PB 0x00000004ed800000| Untracked | 0 +| 462|0x00000004ee000000, 0x00000004ee800000, 0x00000004ee800000|100%| O| |TAMS 0x00000004ee000000| PB 0x00000004ee000000| Untracked | 0 +| 463|0x00000004ee800000, 0x00000004ef000000, 0x00000004ef000000|100%| O| |TAMS 0x00000004ee800000| PB 0x00000004ee800000| Untracked | 0 +| 464|0x00000004ef000000, 0x00000004ef800000, 0x00000004ef800000|100%| O| |TAMS 0x00000004ef000000| PB 0x00000004ef000000| Untracked | 0 +| 465|0x00000004ef800000, 0x00000004f0000000, 0x00000004f0000000|100%| O| |TAMS 0x00000004ef800000| PB 0x00000004ef800000| Untracked | 0 +| 466|0x00000004f0000000, 0x00000004f0800000, 0x00000004f0800000|100%| O| |TAMS 0x00000004f0000000| PB 0x00000004f0000000| Untracked | 0 +| 467|0x00000004f0800000, 0x00000004f1000000, 0x00000004f1000000|100%| O| |TAMS 0x00000004f0800000| PB 0x00000004f0800000| Untracked | 0 +| 468|0x00000004f1000000, 0x00000004f1800000, 0x00000004f1800000|100%| O| |TAMS 0x00000004f1000000| PB 0x00000004f1000000| Untracked | 0 +| 469|0x00000004f1800000, 0x00000004f2000000, 0x00000004f2000000|100%| O| |TAMS 0x00000004f1800000| PB 0x00000004f1800000| Untracked | 0 +| 470|0x00000004f2000000, 0x00000004f2800000, 0x00000004f2800000|100%| O| |TAMS 0x00000004f2000000| PB 0x00000004f2000000| Untracked | 0 +| 471|0x00000004f2800000, 0x00000004f3000000, 0x00000004f3000000|100%| O| |TAMS 0x00000004f2800000| PB 0x00000004f2800000| Untracked | 0 +| 472|0x00000004f3000000, 0x00000004f3800000, 0x00000004f3800000|100%| O| |TAMS 0x00000004f3000000| PB 0x00000004f3000000| Untracked | 0 +| 473|0x00000004f3800000, 0x00000004f4000000, 0x00000004f4000000|100%| O| |TAMS 0x00000004f3800000| PB 0x00000004f3800000| Untracked | 0 +| 474|0x00000004f4000000, 0x00000004f4800000, 0x00000004f4800000|100%| O| |TAMS 0x00000004f4000000| PB 0x00000004f4000000| Untracked | 0 +| 475|0x00000004f4800000, 0x00000004f5000000, 0x00000004f5000000|100%| O| |TAMS 0x00000004f4800000| PB 0x00000004f4800000| Untracked | 0 +| 476|0x00000004f5000000, 0x00000004f5800000, 0x00000004f5800000|100%| O| |TAMS 0x00000004f5000000| PB 0x00000004f5000000| Untracked | 0 +| 477|0x00000004f5800000, 0x00000004f6000000, 0x00000004f6000000|100%| O| |TAMS 0x00000004f5800000| PB 0x00000004f5800000| Untracked | 0 +| 478|0x00000004f6000000, 0x00000004f6800000, 0x00000004f6800000|100%| O| |TAMS 0x00000004f6000000| PB 0x00000004f6000000| Untracked | 0 +| 479|0x00000004f6800000, 0x00000004f7000000, 0x00000004f7000000|100%| O| |TAMS 0x00000004f6800000| PB 0x00000004f6800000| Untracked | 0 +| 480|0x00000004f7000000, 0x00000004f7800000, 0x00000004f7800000|100%| O| |TAMS 0x00000004f7000000| PB 0x00000004f7000000| Untracked | 0 +| 481|0x00000004f7800000, 0x00000004f8000000, 0x00000004f8000000|100%| O| |TAMS 0x00000004f7800000| PB 0x00000004f7800000| Untracked | 0 +| 482|0x00000004f8000000, 0x00000004f8800000, 0x00000004f8800000|100%| O| |TAMS 0x00000004f8000000| PB 0x00000004f8000000| Untracked | 0 +| 483|0x00000004f8800000, 0x00000004f9000000, 0x00000004f9000000|100%| O| |TAMS 0x00000004f8800000| PB 0x00000004f8800000| Untracked | 0 +| 484|0x00000004f9000000, 0x00000004f9800000, 0x00000004f9800000|100%| O| |TAMS 0x00000004f9000000| PB 0x00000004f9000000| Untracked | 0 +| 485|0x00000004f9800000, 0x00000004fa000000, 0x00000004fa000000|100%| O| |TAMS 0x00000004f9800000| PB 0x00000004f9800000| Untracked | 0 +| 486|0x00000004fa000000, 0x00000004fa800000, 0x00000004fa800000|100%| O| |TAMS 0x00000004fa000000| PB 0x00000004fa000000| Untracked | 0 +| 487|0x00000004fa800000, 0x00000004fb000000, 0x00000004fb000000|100%| O| |TAMS 0x00000004fa800000| PB 0x00000004fa800000| Untracked | 0 +| 488|0x00000004fb000000, 0x00000004fb800000, 0x00000004fb800000|100%| O| |TAMS 0x00000004fb000000| PB 0x00000004fb000000| Untracked | 0 +| 489|0x00000004fb800000, 0x00000004fc000000, 0x00000004fc000000|100%| O| |TAMS 0x00000004fb800000| PB 0x00000004fb800000| Untracked | 0 +| 490|0x00000004fc000000, 0x00000004fc800000, 0x00000004fc800000|100%| O| |TAMS 0x00000004fc000000| PB 0x00000004fc000000| Untracked | 0 +| 491|0x00000004fc800000, 0x00000004fd000000, 0x00000004fd000000|100%| O| |TAMS 0x00000004fc800000| PB 0x00000004fc800000| Untracked | 0 +| 492|0x00000004fd000000, 0x00000004fd800000, 0x00000004fd800000|100%| O| |TAMS 0x00000004fd000000| PB 0x00000004fd000000| Untracked | 0 +| 493|0x00000004fd800000, 0x00000004fe000000, 0x00000004fe000000|100%| O| |TAMS 0x00000004fd800000| PB 0x00000004fd800000| Untracked | 0 +| 494|0x00000004fe000000, 0x00000004fe800000, 0x00000004fe800000|100%| O| |TAMS 0x00000004fe000000| PB 0x00000004fe000000| Untracked | 0 +| 495|0x00000004fe800000, 0x00000004ff000000, 0x00000004ff000000|100%| O| |TAMS 0x00000004fe800000| PB 0x00000004fe800000| Untracked | 0 +| 496|0x00000004ff000000, 0x00000004ff800000, 0x00000004ff800000|100%| O| |TAMS 0x00000004ff000000| PB 0x00000004ff000000| Untracked | 0 +| 497|0x00000004ff800000, 0x0000000500000000, 0x0000000500000000|100%| O| |TAMS 0x00000004ff800000| PB 0x00000004ff800000| Untracked | 0 +| 498|0x0000000500000000, 0x0000000500800000, 0x0000000500800000|100%| O| |TAMS 0x0000000500000000| PB 0x0000000500000000| Untracked | 0 +| 499|0x0000000500800000, 0x0000000501000000, 0x0000000501000000|100%| O| |TAMS 0x0000000500800000| PB 0x0000000500800000| Untracked | 0 +| 500|0x0000000501000000, 0x0000000501800000, 0x0000000501800000|100%| O| |TAMS 0x0000000501000000| PB 0x0000000501000000| Untracked | 0 +| 501|0x0000000501800000, 0x0000000502000000, 0x0000000502000000|100%| O| |TAMS 0x0000000501800000| PB 0x0000000501800000| Untracked | 0 +| 502|0x0000000502000000, 0x0000000502800000, 0x0000000502800000|100%| O| |TAMS 0x0000000502000000| PB 0x0000000502000000| Untracked | 0 +| 503|0x0000000502800000, 0x0000000503000000, 0x0000000503000000|100%| O| |TAMS 0x0000000502800000| PB 0x0000000502800000| Untracked | 0 +| 504|0x0000000503000000, 0x0000000503800000, 0x0000000503800000|100%| O| |TAMS 0x0000000503000000| PB 0x0000000503000000| Untracked | 0 +| 505|0x0000000503800000, 0x0000000504000000, 0x0000000504000000|100%| O| |TAMS 0x0000000503800000| PB 0x0000000503800000| Untracked | 0 +| 506|0x0000000504000000, 0x0000000504800000, 0x0000000504800000|100%| O| |TAMS 0x0000000504000000| PB 0x0000000504000000| Untracked | 0 +| 507|0x0000000504800000, 0x0000000505000000, 0x0000000505000000|100%| O| |TAMS 0x0000000504800000| PB 0x0000000504800000| Untracked | 0 +| 508|0x0000000505000000, 0x0000000505800000, 0x0000000505800000|100%| O| |TAMS 0x0000000505000000| PB 0x0000000505000000| Untracked | 0 +| 509|0x0000000505800000, 0x0000000506000000, 0x0000000506000000|100%| O| |TAMS 0x0000000505800000| PB 0x0000000505800000| Untracked | 0 +| 510|0x0000000506000000, 0x0000000506800000, 0x0000000506800000|100%| O| |TAMS 0x0000000506000000| PB 0x0000000506000000| Untracked | 0 +| 511|0x0000000506800000, 0x0000000507000000, 0x0000000507000000|100%| O| |TAMS 0x0000000506800000| PB 0x0000000506800000| Untracked | 0 +| 512|0x0000000507000000, 0x0000000507800000, 0x0000000507800000|100%| O| |TAMS 0x0000000507000000| PB 0x0000000507000000| Untracked | 0 +| 513|0x0000000507800000, 0x0000000508000000, 0x0000000508000000|100%| O| |TAMS 0x0000000507800000| PB 0x0000000507800000| Untracked | 0 +| 514|0x0000000508000000, 0x0000000508800000, 0x0000000508800000|100%| O| |TAMS 0x0000000508000000| PB 0x0000000508000000| Untracked | 0 +| 515|0x0000000508800000, 0x0000000509000000, 0x0000000509000000|100%| O| |TAMS 0x0000000508800000| PB 0x0000000508800000| Untracked | 0 +| 516|0x0000000509000000, 0x0000000509800000, 0x0000000509800000|100%| O| |TAMS 0x0000000509000000| PB 0x0000000509000000| Untracked | 0 +| 517|0x0000000509800000, 0x000000050a000000, 0x000000050a000000|100%| O| |TAMS 0x0000000509800000| PB 0x0000000509800000| Untracked | 0 +| 518|0x000000050a000000, 0x000000050a800000, 0x000000050a800000|100%| O| |TAMS 0x000000050a000000| PB 0x000000050a000000| Untracked | 0 +| 519|0x000000050a800000, 0x000000050b000000, 0x000000050b000000|100%| O| |TAMS 0x000000050a800000| PB 0x000000050a800000| Untracked | 0 +| 520|0x000000050b000000, 0x000000050b800000, 0x000000050b800000|100%| O| |TAMS 0x000000050b000000| PB 0x000000050b000000| Untracked | 0 +| 521|0x000000050b800000, 0x000000050c000000, 0x000000050c000000|100%| O| |TAMS 0x000000050b800000| PB 0x000000050b800000| Untracked | 0 +| 522|0x000000050c000000, 0x000000050c800000, 0x000000050c800000|100%| O| |TAMS 0x000000050c000000| PB 0x000000050c000000| Untracked | 0 +| 523|0x000000050c800000, 0x000000050d000000, 0x000000050d000000|100%| O| |TAMS 0x000000050c800000| PB 0x000000050c800000| Untracked | 0 +| 524|0x000000050d000000, 0x000000050d800000, 0x000000050d800000|100%| O| |TAMS 0x000000050d000000| PB 0x000000050d000000| Untracked | 0 +| 525|0x000000050d800000, 0x000000050e000000, 0x000000050e000000|100%| O| |TAMS 0x000000050d800000| PB 0x000000050d800000| Untracked | 0 +| 526|0x000000050e000000, 0x000000050e800000, 0x000000050e800000|100%| O| |TAMS 0x000000050e000000| PB 0x000000050e000000| Untracked | 0 +| 527|0x000000050e800000, 0x000000050f000000, 0x000000050f000000|100%| O| |TAMS 0x000000050e800000| PB 0x000000050e800000| Untracked | 0 +| 528|0x000000050f000000, 0x000000050f800000, 0x000000050f800000|100%| O| |TAMS 0x000000050f000000| PB 0x000000050f000000| Untracked | 0 +| 529|0x000000050f800000, 0x0000000510000000, 0x0000000510000000|100%| O| |TAMS 0x000000050f800000| PB 0x000000050f800000| Untracked | 0 +| 530|0x0000000510000000, 0x0000000510800000, 0x0000000510800000|100%| O| |TAMS 0x0000000510000000| PB 0x0000000510000000| Untracked | 0 +| 531|0x0000000510800000, 0x0000000511000000, 0x0000000511000000|100%| O| |TAMS 0x0000000510800000| PB 0x0000000510800000| Untracked | 0 +| 532|0x0000000511000000, 0x0000000511800000, 0x0000000511800000|100%| O| |TAMS 0x0000000511000000| PB 0x0000000511000000| Untracked | 0 +| 533|0x0000000511800000, 0x0000000512000000, 0x0000000512000000|100%| O| |TAMS 0x0000000511800000| PB 0x0000000511800000| Untracked | 0 +| 534|0x0000000512000000, 0x0000000512800000, 0x0000000512800000|100%| O| |TAMS 0x0000000512000000| PB 0x0000000512000000| Untracked | 0 +| 535|0x0000000512800000, 0x0000000513000000, 0x0000000513000000|100%| O| |TAMS 0x0000000512800000| PB 0x0000000512800000| Untracked | 0 +| 536|0x0000000513000000, 0x0000000513800000, 0x0000000513800000|100%| O| |TAMS 0x0000000513000000| PB 0x0000000513000000| Untracked | 0 +| 537|0x0000000513800000, 0x0000000514000000, 0x0000000514000000|100%| O| |TAMS 0x0000000513800000| PB 0x0000000513800000| Untracked | 0 +| 538|0x0000000514000000, 0x0000000514800000, 0x0000000514800000|100%| O| |TAMS 0x0000000514000000| PB 0x0000000514000000| Untracked | 0 +| 539|0x0000000514800000, 0x0000000515000000, 0x0000000515000000|100%| O| |TAMS 0x0000000514800000| PB 0x0000000514800000| Untracked | 0 +| 540|0x0000000515000000, 0x0000000515800000, 0x0000000515800000|100%| O| |TAMS 0x0000000515000000| PB 0x0000000515000000| Untracked | 0 +| 541|0x0000000515800000, 0x0000000516000000, 0x0000000516000000|100%| O| |TAMS 0x0000000515800000| PB 0x0000000515800000| Untracked | 0 +| 542|0x0000000516000000, 0x0000000516800000, 0x0000000516800000|100%| O| |TAMS 0x0000000516000000| PB 0x0000000516000000| Untracked | 0 +| 543|0x0000000516800000, 0x0000000517000000, 0x0000000517000000|100%| O| |TAMS 0x0000000516800000| PB 0x0000000516800000| Untracked | 0 +| 544|0x0000000517000000, 0x0000000517800000, 0x0000000517800000|100%| O| |TAMS 0x0000000517000000| PB 0x0000000517000000| Untracked | 0 +| 545|0x0000000517800000, 0x0000000518000000, 0x0000000518000000|100%| O| |TAMS 0x0000000517800000| PB 0x0000000517800000| Untracked | 0 +| 546|0x0000000518000000, 0x0000000518800000, 0x0000000518800000|100%| O| |TAMS 0x0000000518000000| PB 0x0000000518000000| Untracked | 0 +| 547|0x0000000518800000, 0x0000000519000000, 0x0000000519000000|100%| O| |TAMS 0x0000000518800000| PB 0x0000000518800000| Untracked | 0 +| 548|0x0000000519000000, 0x0000000519800000, 0x0000000519800000|100%| O| |TAMS 0x0000000519000000| PB 0x0000000519000000| Untracked | 0 +| 549|0x0000000519800000, 0x000000051a000000, 0x000000051a000000|100%| O| |TAMS 0x0000000519800000| PB 0x0000000519800000| Untracked | 0 +| 550|0x000000051a000000, 0x000000051a800000, 0x000000051a800000|100%| O| |TAMS 0x000000051a000000| PB 0x000000051a000000| Untracked | 0 +| 551|0x000000051a800000, 0x000000051b000000, 0x000000051b000000|100%| O| |TAMS 0x000000051a800000| PB 0x000000051a800000| Untracked | 0 +| 552|0x000000051b000000, 0x000000051b800000, 0x000000051b800000|100%| O| |TAMS 0x000000051b000000| PB 0x000000051b000000| Untracked | 0 +| 553|0x000000051b800000, 0x000000051c000000, 0x000000051c000000|100%| O| |TAMS 0x000000051b800000| PB 0x000000051b800000| Untracked | 0 +| 554|0x000000051c000000, 0x000000051c800000, 0x000000051c800000|100%| O| |TAMS 0x000000051c000000| PB 0x000000051c000000| Untracked | 0 +| 555|0x000000051c800000, 0x000000051d000000, 0x000000051d000000|100%| O| |TAMS 0x000000051c800000| PB 0x000000051c800000| Untracked | 0 +| 556|0x000000051d000000, 0x000000051d800000, 0x000000051d800000|100%| O| |TAMS 0x000000051d000000| PB 0x000000051d000000| Untracked | 0 +| 557|0x000000051d800000, 0x000000051e000000, 0x000000051e000000|100%| O| |TAMS 0x000000051d800000| PB 0x000000051d800000| Untracked | 0 +| 558|0x000000051e000000, 0x000000051e800000, 0x000000051e800000|100%| O| |TAMS 0x000000051e000000| PB 0x000000051e000000| Untracked | 0 +| 559|0x000000051e800000, 0x000000051f000000, 0x000000051f000000|100%| O| |TAMS 0x000000051e800000| PB 0x000000051e800000| Untracked | 0 +| 560|0x000000051f000000, 0x000000051f800000, 0x000000051f800000|100%| O| |TAMS 0x000000051f000000| PB 0x000000051f000000| Untracked | 0 +| 561|0x000000051f800000, 0x0000000520000000, 0x0000000520000000|100%| O| |TAMS 0x000000051f800000| PB 0x000000051f800000| Untracked | 0 +| 562|0x0000000520000000, 0x0000000520800000, 0x0000000520800000|100%| O| |TAMS 0x0000000520000000| PB 0x0000000520000000| Untracked | 0 +| 563|0x0000000520800000, 0x0000000521000000, 0x0000000521000000|100%| O| |TAMS 0x0000000520800000| PB 0x0000000520800000| Untracked | 0 +| 564|0x0000000521000000, 0x0000000521800000, 0x0000000521800000|100%| O| |TAMS 0x0000000521000000| PB 0x0000000521000000| Untracked | 0 +| 565|0x0000000521800000, 0x0000000522000000, 0x0000000522000000|100%| O| |TAMS 0x0000000521800000| PB 0x0000000521800000| Untracked | 0 +| 566|0x0000000522000000, 0x0000000522800000, 0x0000000522800000|100%| O| |TAMS 0x0000000522000000| PB 0x0000000522000000| Untracked | 0 +| 567|0x0000000522800000, 0x0000000523000000, 0x0000000523000000|100%| O| |TAMS 0x0000000522800000| PB 0x0000000522800000| Untracked | 0 +| 568|0x0000000523000000, 0x0000000523800000, 0x0000000523800000|100%| O| |TAMS 0x0000000523000000| PB 0x0000000523000000| Untracked | 0 +| 569|0x0000000523800000, 0x0000000524000000, 0x0000000524000000|100%| O| |TAMS 0x0000000523800000| PB 0x0000000523800000| Untracked | 0 +| 570|0x0000000524000000, 0x0000000524800000, 0x0000000524800000|100%| O| |TAMS 0x0000000524000000| PB 0x0000000524000000| Untracked | 0 +| 571|0x0000000524800000, 0x0000000525000000, 0x0000000525000000|100%| O| |TAMS 0x0000000524800000| PB 0x0000000524800000| Untracked | 0 +| 572|0x0000000525000000, 0x0000000525800000, 0x0000000525800000|100%| O| |TAMS 0x0000000525000000| PB 0x0000000525000000| Untracked | 0 +| 573|0x0000000525800000, 0x0000000526000000, 0x0000000526000000|100%| O| |TAMS 0x0000000525800000| PB 0x0000000525800000| Untracked | 0 +| 574|0x0000000526000000, 0x0000000526800000, 0x0000000526800000|100%| O| |TAMS 0x0000000526000000| PB 0x0000000526000000| Untracked | 0 +| 575|0x0000000526800000, 0x0000000527000000, 0x0000000527000000|100%| O| |TAMS 0x0000000526800000| PB 0x0000000526800000| Untracked | 0 +| 576|0x0000000527000000, 0x0000000527800000, 0x0000000527800000|100%| O| |TAMS 0x0000000527000000| PB 0x0000000527000000| Untracked | 0 +| 577|0x0000000527800000, 0x0000000528000000, 0x0000000528000000|100%| O| |TAMS 0x0000000527800000| PB 0x0000000527800000| Untracked | 0 +| 578|0x0000000528000000, 0x0000000528800000, 0x0000000528800000|100%| O| |TAMS 0x0000000528000000| PB 0x0000000528000000| Untracked | 0 +| 579|0x0000000528800000, 0x0000000529000000, 0x0000000529000000|100%| O| |TAMS 0x0000000528800000| PB 0x0000000528800000| Untracked | 0 +| 580|0x0000000529000000, 0x0000000529800000, 0x0000000529800000|100%| O| |TAMS 0x0000000529000000| PB 0x0000000529000000| Untracked | 0 +| 581|0x0000000529800000, 0x000000052a000000, 0x000000052a000000|100%| O| |TAMS 0x0000000529800000| PB 0x0000000529800000| Untracked | 0 +| 582|0x000000052a000000, 0x000000052a800000, 0x000000052a800000|100%| O| |TAMS 0x000000052a000000| PB 0x000000052a000000| Untracked | 0 +| 583|0x000000052a800000, 0x000000052b000000, 0x000000052b000000|100%| O| |TAMS 0x000000052a800000| PB 0x000000052a800000| Untracked | 0 +| 584|0x000000052b000000, 0x000000052b800000, 0x000000052b800000|100%| O| |TAMS 0x000000052b000000| PB 0x000000052b000000| Untracked | 0 +| 585|0x000000052b800000, 0x000000052c000000, 0x000000052c000000|100%| O| |TAMS 0x000000052b800000| PB 0x000000052b800000| Untracked | 0 +| 586|0x000000052c000000, 0x000000052c800000, 0x000000052c800000|100%| O| |TAMS 0x000000052c000000| PB 0x000000052c000000| Untracked | 0 +| 587|0x000000052c800000, 0x000000052d000000, 0x000000052d000000|100%| O| |TAMS 0x000000052c800000| PB 0x000000052c800000| Untracked | 0 +| 588|0x000000052d000000, 0x000000052d800000, 0x000000052d800000|100%| O| |TAMS 0x000000052d000000| PB 0x000000052d000000| Untracked | 0 +| 589|0x000000052d800000, 0x000000052e000000, 0x000000052e000000|100%| O| |TAMS 0x000000052d800000| PB 0x000000052d800000| Untracked | 0 +| 590|0x000000052e000000, 0x000000052e800000, 0x000000052e800000|100%| O| |TAMS 0x000000052e000000| PB 0x000000052e000000| Untracked | 0 +| 591|0x000000052e800000, 0x000000052f000000, 0x000000052f000000|100%| O| |TAMS 0x000000052e800000| PB 0x000000052e800000| Untracked | 0 +| 592|0x000000052f000000, 0x000000052f800000, 0x000000052f800000|100%| O| |TAMS 0x000000052f000000| PB 0x000000052f000000| Untracked | 0 +| 593|0x000000052f800000, 0x0000000530000000, 0x0000000530000000|100%| O| |TAMS 0x000000052f800000| PB 0x000000052f800000| Untracked | 0 +| 594|0x0000000530000000, 0x0000000530800000, 0x0000000530800000|100%| O| |TAMS 0x0000000530000000| PB 0x0000000530000000| Untracked | 0 +| 595|0x0000000530800000, 0x0000000531000000, 0x0000000531000000|100%| O| |TAMS 0x0000000530800000| PB 0x0000000530800000| Untracked | 0 +| 596|0x0000000531000000, 0x0000000531800000, 0x0000000531800000|100%| O| |TAMS 0x0000000531000000| PB 0x0000000531000000| Untracked | 0 +| 597|0x0000000531800000, 0x0000000532000000, 0x0000000532000000|100%| O| |TAMS 0x0000000531800000| PB 0x0000000531800000| Untracked | 0 +| 598|0x0000000532000000, 0x0000000532800000, 0x0000000532800000|100%| O| |TAMS 0x0000000532000000| PB 0x0000000532000000| Untracked | 0 +| 599|0x0000000532800000, 0x0000000533000000, 0x0000000533000000|100%| O| |TAMS 0x0000000532800000| PB 0x0000000532800000| Untracked | 0 +| 600|0x0000000533000000, 0x0000000533800000, 0x0000000533800000|100%| O| |TAMS 0x0000000533000000| PB 0x0000000533000000| Untracked | 0 +| 601|0x0000000533800000, 0x0000000534000000, 0x0000000534000000|100%| O| |TAMS 0x0000000533800000| PB 0x0000000533800000| Untracked | 0 +| 602|0x0000000534000000, 0x0000000534800000, 0x0000000534800000|100%| O| |TAMS 0x0000000534000000| PB 0x0000000534000000| Untracked | 0 +| 603|0x0000000534800000, 0x0000000535000000, 0x0000000535000000|100%| O| |TAMS 0x0000000534800000| PB 0x0000000534800000| Untracked | 0 +| 604|0x0000000535000000, 0x0000000535800000, 0x0000000535800000|100%| O| |TAMS 0x0000000535000000| PB 0x0000000535000000| Untracked | 0 +| 605|0x0000000535800000, 0x0000000536000000, 0x0000000536000000|100%| O| |TAMS 0x0000000535800000| PB 0x0000000535800000| Untracked | 0 +| 606|0x0000000536000000, 0x0000000536800000, 0x0000000536800000|100%| O| |TAMS 0x0000000536000000| PB 0x0000000536000000| Untracked | 0 +| 607|0x0000000536800000, 0x0000000537000000, 0x0000000537000000|100%| O| |TAMS 0x0000000536800000| PB 0x0000000536800000| Untracked | 0 +| 608|0x0000000537000000, 0x0000000537800000, 0x0000000537800000|100%| O| |TAMS 0x0000000537000000| PB 0x0000000537000000| Untracked | 0 +| 609|0x0000000537800000, 0x0000000538000000, 0x0000000538000000|100%| O| |TAMS 0x0000000537800000| PB 0x0000000537800000| Untracked | 0 +| 610|0x0000000538000000, 0x0000000538800000, 0x0000000538800000|100%| O| |TAMS 0x0000000538000000| PB 0x0000000538000000| Untracked | 0 +| 611|0x0000000538800000, 0x0000000539000000, 0x0000000539000000|100%| O| |TAMS 0x0000000538800000| PB 0x0000000538800000| Untracked | 0 +| 612|0x0000000539000000, 0x0000000539800000, 0x0000000539800000|100%| O| |TAMS 0x0000000539000000| PB 0x0000000539000000| Untracked | 0 +| 613|0x0000000539800000, 0x000000053a000000, 0x000000053a000000|100%| O| |TAMS 0x0000000539800000| PB 0x0000000539800000| Untracked | 0 +| 614|0x000000053a000000, 0x000000053a800000, 0x000000053a800000|100%| O| |TAMS 0x000000053a000000| PB 0x000000053a000000| Untracked | 0 +| 615|0x000000053a800000, 0x000000053b000000, 0x000000053b000000|100%| O| |TAMS 0x000000053a800000| PB 0x000000053a800000| Untracked | 0 +| 616|0x000000053b000000, 0x000000053b800000, 0x000000053b800000|100%| O| |TAMS 0x000000053b000000| PB 0x000000053b000000| Untracked | 0 +| 617|0x000000053b800000, 0x000000053c000000, 0x000000053c000000|100%| O| |TAMS 0x000000053b800000| PB 0x000000053b800000| Untracked | 0 +| 618|0x000000053c000000, 0x000000053c800000, 0x000000053c800000|100%| O| |TAMS 0x000000053c000000| PB 0x000000053c000000| Untracked | 0 +| 619|0x000000053c800000, 0x000000053d000000, 0x000000053d000000|100%| O| |TAMS 0x000000053c800000| PB 0x000000053c800000| Untracked | 0 +| 620|0x000000053d000000, 0x000000053d800000, 0x000000053d800000|100%| O| |TAMS 0x000000053d000000| PB 0x000000053d000000| Untracked | 0 +| 621|0x000000053d800000, 0x000000053e000000, 0x000000053e000000|100%| O| |TAMS 0x000000053d800000| PB 0x000000053d800000| Untracked | 0 +| 622|0x000000053e000000, 0x000000053e800000, 0x000000053e800000|100%| O| |TAMS 0x000000053e000000| PB 0x000000053e000000| Untracked | 0 +| 623|0x000000053e800000, 0x000000053f000000, 0x000000053f000000|100%| O| |TAMS 0x000000053e800000| PB 0x000000053e800000| Untracked | 0 +| 624|0x000000053f000000, 0x000000053f800000, 0x000000053f800000|100%| O| |TAMS 0x000000053f000000| PB 0x000000053f000000| Untracked | 0 +| 625|0x000000053f800000, 0x0000000540000000, 0x0000000540000000|100%| O| |TAMS 0x000000053f800000| PB 0x000000053f800000| Untracked | 0 +| 626|0x0000000540000000, 0x0000000540800000, 0x0000000540800000|100%| O| |TAMS 0x0000000540000000| PB 0x0000000540000000| Untracked | 0 +| 627|0x0000000540800000, 0x0000000541000000, 0x0000000541000000|100%| O| |TAMS 0x0000000540800000| PB 0x0000000540800000| Untracked | 0 +| 628|0x0000000541000000, 0x0000000541800000, 0x0000000541800000|100%| O| |TAMS 0x0000000541000000| PB 0x0000000541000000| Untracked | 0 +| 629|0x0000000541800000, 0x0000000542000000, 0x0000000542000000|100%| O| |TAMS 0x0000000541800000| PB 0x0000000541800000| Untracked | 0 +| 630|0x0000000542000000, 0x0000000542800000, 0x0000000542800000|100%| O| |TAMS 0x0000000542000000| PB 0x0000000542000000| Untracked | 0 +| 631|0x0000000542800000, 0x0000000543000000, 0x0000000543000000|100%| O| |TAMS 0x0000000542800000| PB 0x0000000542800000| Untracked | 0 +| 632|0x0000000543000000, 0x0000000543800000, 0x0000000543800000|100%| O| |TAMS 0x0000000543000000| PB 0x0000000543000000| Untracked | 0 +| 633|0x0000000543800000, 0x0000000544000000, 0x0000000544000000|100%| O| |TAMS 0x0000000543800000| PB 0x0000000543800000| Untracked | 0 +| 634|0x0000000544000000, 0x0000000544800000, 0x0000000544800000|100%| O| |TAMS 0x0000000544000000| PB 0x0000000544000000| Untracked | 0 +| 635|0x0000000544800000, 0x0000000545000000, 0x0000000545000000|100%| O| |TAMS 0x0000000544800000| PB 0x0000000544800000| Untracked | 0 +| 636|0x0000000545000000, 0x0000000545800000, 0x0000000545800000|100%| O| |TAMS 0x0000000545000000| PB 0x0000000545000000| Untracked | 0 +| 637|0x0000000545800000, 0x0000000546000000, 0x0000000546000000|100%| O| |TAMS 0x0000000545800000| PB 0x0000000545800000| Untracked | 0 +| 638|0x0000000546000000, 0x0000000546800000, 0x0000000546800000|100%| O| |TAMS 0x0000000546000000| PB 0x0000000546000000| Untracked | 0 +| 639|0x0000000546800000, 0x0000000547000000, 0x0000000547000000|100%| O| |TAMS 0x0000000546800000| PB 0x0000000546800000| Untracked | 0 +| 640|0x0000000547000000, 0x0000000547800000, 0x0000000547800000|100%| O| |TAMS 0x0000000547000000| PB 0x0000000547000000| Untracked | 0 +| 641|0x0000000547800000, 0x0000000548000000, 0x0000000548000000|100%| O| |TAMS 0x0000000547800000| PB 0x0000000547800000| Untracked | 0 +| 642|0x0000000548000000, 0x0000000548800000, 0x0000000548800000|100%| O| |TAMS 0x0000000548000000| PB 0x0000000548000000| Untracked | 0 +| 643|0x0000000548800000, 0x0000000549000000, 0x0000000549000000|100%| O| |TAMS 0x0000000548800000| PB 0x0000000548800000| Untracked | 0 +| 644|0x0000000549000000, 0x0000000549800000, 0x0000000549800000|100%| O| |TAMS 0x0000000549000000| PB 0x0000000549000000| Untracked | 0 +| 645|0x0000000549800000, 0x000000054a000000, 0x000000054a000000|100%| O| |TAMS 0x0000000549800000| PB 0x0000000549800000| Untracked | 0 +| 646|0x000000054a000000, 0x000000054a800000, 0x000000054a800000|100%| O| |TAMS 0x000000054a000000| PB 0x000000054a000000| Untracked | 0 +| 647|0x000000054a800000, 0x000000054b000000, 0x000000054b000000|100%| O| |TAMS 0x000000054a800000| PB 0x000000054a800000| Untracked | 0 +| 648|0x000000054b000000, 0x000000054b800000, 0x000000054b800000|100%| O| |TAMS 0x000000054b000000| PB 0x000000054b000000| Untracked | 0 +| 649|0x000000054b800000, 0x000000054c000000, 0x000000054c000000|100%| O| |TAMS 0x000000054b800000| PB 0x000000054b800000| Untracked | 0 +| 650|0x000000054c000000, 0x000000054c800000, 0x000000054c800000|100%| O| |TAMS 0x000000054c000000| PB 0x000000054c000000| Untracked | 0 +| 651|0x000000054c800000, 0x000000054d000000, 0x000000054d000000|100%| O| |TAMS 0x000000054c800000| PB 0x000000054c800000| Untracked | 0 +| 652|0x000000054d000000, 0x000000054d800000, 0x000000054d800000|100%| O| |TAMS 0x000000054d000000| PB 0x000000054d000000| Untracked | 0 +| 653|0x000000054d800000, 0x000000054e000000, 0x000000054e000000|100%| O| |TAMS 0x000000054d800000| PB 0x000000054d800000| Untracked | 0 +| 654|0x000000054e000000, 0x000000054e800000, 0x000000054e800000|100%| O| |TAMS 0x000000054e000000| PB 0x000000054e000000| Untracked | 0 +| 655|0x000000054e800000, 0x000000054f000000, 0x000000054f000000|100%| O| |TAMS 0x000000054e800000| PB 0x000000054e800000| Untracked | 0 +| 656|0x000000054f000000, 0x000000054f800000, 0x000000054f800000|100%| O| |TAMS 0x000000054f000000| PB 0x000000054f000000| Untracked | 0 +| 657|0x000000054f800000, 0x0000000550000000, 0x0000000550000000|100%| O| |TAMS 0x000000054f800000| PB 0x000000054f800000| Untracked | 0 +| 658|0x0000000550000000, 0x0000000550800000, 0x0000000550800000|100%| O| |TAMS 0x0000000550000000| PB 0x0000000550000000| Untracked | 0 +| 659|0x0000000550800000, 0x0000000551000000, 0x0000000551000000|100%| O| |TAMS 0x0000000550800000| PB 0x0000000550800000| Untracked | 0 +| 660|0x0000000551000000, 0x0000000551800000, 0x0000000551800000|100%| O| |TAMS 0x0000000551000000| PB 0x0000000551000000| Untracked | 0 +| 661|0x0000000551800000, 0x0000000552000000, 0x0000000552000000|100%| O| |TAMS 0x0000000551800000| PB 0x0000000551800000| Untracked | 0 +| 662|0x0000000552000000, 0x0000000552800000, 0x0000000552800000|100%| O| |TAMS 0x0000000552000000| PB 0x0000000552000000| Untracked | 0 +| 663|0x0000000552800000, 0x0000000553000000, 0x0000000553000000|100%| O| |TAMS 0x0000000552800000| PB 0x0000000552800000| Untracked | 0 +| 664|0x0000000553000000, 0x0000000553800000, 0x0000000553800000|100%| O| |TAMS 0x0000000553000000| PB 0x0000000553000000| Untracked | 0 +| 665|0x0000000553800000, 0x0000000554000000, 0x0000000554000000|100%| O| |TAMS 0x0000000553800000| PB 0x0000000553800000| Untracked | 0 +| 666|0x0000000554000000, 0x0000000554800000, 0x0000000554800000|100%| O| |TAMS 0x0000000554000000| PB 0x0000000554000000| Untracked | 0 +| 667|0x0000000554800000, 0x0000000555000000, 0x0000000555000000|100%| O| |TAMS 0x0000000554800000| PB 0x0000000554800000| Untracked | 0 +| 668|0x0000000555000000, 0x0000000555800000, 0x0000000555800000|100%| O| |TAMS 0x0000000555000000| PB 0x0000000555000000| Untracked | 0 +| 669|0x0000000555800000, 0x0000000556000000, 0x0000000556000000|100%| O| |TAMS 0x0000000555800000| PB 0x0000000555800000| Untracked | 0 +| 670|0x0000000556000000, 0x0000000556800000, 0x0000000556800000|100%| O| |TAMS 0x0000000556000000| PB 0x0000000556000000| Untracked | 0 +| 671|0x0000000556800000, 0x0000000557000000, 0x0000000557000000|100%| O| |TAMS 0x0000000556800000| PB 0x0000000556800000| Untracked | 0 +| 672|0x0000000557000000, 0x0000000557800000, 0x0000000557800000|100%| O| |TAMS 0x0000000557000000| PB 0x0000000557000000| Untracked | 0 +| 673|0x0000000557800000, 0x0000000558000000, 0x0000000558000000|100%| O| |TAMS 0x0000000557800000| PB 0x0000000557800000| Untracked | 0 +| 674|0x0000000558000000, 0x0000000558800000, 0x0000000558800000|100%| O| |TAMS 0x0000000558000000| PB 0x0000000558000000| Untracked | 0 +| 675|0x0000000558800000, 0x0000000559000000, 0x0000000559000000|100%| O| |TAMS 0x0000000558800000| PB 0x0000000558800000| Untracked | 0 +| 676|0x0000000559000000, 0x0000000559800000, 0x0000000559800000|100%| O| |TAMS 0x0000000559000000| PB 0x0000000559000000| Untracked | 0 +| 677|0x0000000559800000, 0x000000055a000000, 0x000000055a000000|100%| O| |TAMS 0x0000000559800000| PB 0x0000000559800000| Untracked | 0 +| 678|0x000000055a000000, 0x000000055a800000, 0x000000055a800000|100%| O| |TAMS 0x000000055a000000| PB 0x000000055a000000| Untracked | 0 +| 679|0x000000055a800000, 0x000000055b000000, 0x000000055b000000|100%| O| |TAMS 0x000000055a800000| PB 0x000000055a800000| Untracked | 0 +| 680|0x000000055b000000, 0x000000055b800000, 0x000000055b800000|100%| O| |TAMS 0x000000055b000000| PB 0x000000055b000000| Untracked | 0 +| 681|0x000000055b800000, 0x000000055c000000, 0x000000055c000000|100%| O| |TAMS 0x000000055b800000| PB 0x000000055b800000| Untracked | 0 +| 682|0x000000055c000000, 0x000000055c800000, 0x000000055c800000|100%| O| |TAMS 0x000000055c000000| PB 0x000000055c000000| Untracked | 0 +| 683|0x000000055c800000, 0x000000055d000000, 0x000000055d000000|100%| O| |TAMS 0x000000055c800000| PB 0x000000055c800000| Untracked | 0 +| 684|0x000000055d000000, 0x000000055d800000, 0x000000055d800000|100%| O| |TAMS 0x000000055d000000| PB 0x000000055d000000| Untracked | 0 +| 685|0x000000055d800000, 0x000000055e000000, 0x000000055e000000|100%| O| |TAMS 0x000000055d800000| PB 0x000000055d800000| Untracked | 0 +| 686|0x000000055e000000, 0x000000055e800000, 0x000000055e800000|100%| O| |TAMS 0x000000055e000000| PB 0x000000055e000000| Untracked | 0 +| 687|0x000000055e800000, 0x000000055f000000, 0x000000055f000000|100%| O| |TAMS 0x000000055e800000| PB 0x000000055e800000| Untracked | 0 +| 688|0x000000055f000000, 0x000000055f800000, 0x000000055f800000|100%| O| |TAMS 0x000000055f000000| PB 0x000000055f000000| Untracked | 0 +| 689|0x000000055f800000, 0x0000000560000000, 0x0000000560000000|100%| O| |TAMS 0x000000055f800000| PB 0x000000055f800000| Untracked | 0 +| 690|0x0000000560000000, 0x0000000560800000, 0x0000000560800000|100%| O| |TAMS 0x0000000560000000| PB 0x0000000560000000| Untracked | 0 +| 691|0x0000000560800000, 0x0000000561000000, 0x0000000561000000|100%| O| |TAMS 0x0000000560800000| PB 0x0000000560800000| Untracked | 0 +| 692|0x0000000561000000, 0x0000000561800000, 0x0000000561800000|100%| O| |TAMS 0x0000000561000000| PB 0x0000000561000000| Untracked | 0 +| 693|0x0000000561800000, 0x0000000562000000, 0x0000000562000000|100%| O| |TAMS 0x0000000561800000| PB 0x0000000561800000| Untracked | 0 +| 694|0x0000000562000000, 0x0000000562800000, 0x0000000562800000|100%| O| |TAMS 0x0000000562000000| PB 0x0000000562000000| Untracked | 0 +| 695|0x0000000562800000, 0x0000000563000000, 0x0000000563000000|100%| O| |TAMS 0x0000000562800000| PB 0x0000000562800000| Untracked | 0 +| 696|0x0000000563000000, 0x0000000563800000, 0x0000000563800000|100%| O| |TAMS 0x0000000563000000| PB 0x0000000563000000| Untracked | 0 +| 697|0x0000000563800000, 0x0000000564000000, 0x0000000564000000|100%| O| |TAMS 0x0000000563800000| PB 0x0000000563800000| Untracked | 0 +| 698|0x0000000564000000, 0x0000000564800000, 0x0000000564800000|100%| O| |TAMS 0x0000000564000000| PB 0x0000000564000000| Untracked | 0 +| 699|0x0000000564800000, 0x0000000565000000, 0x0000000565000000|100%| O| |TAMS 0x0000000564800000| PB 0x0000000564800000| Untracked | 0 +| 700|0x0000000565000000, 0x0000000565800000, 0x0000000565800000|100%| O| |TAMS 0x0000000565000000| PB 0x0000000565000000| Untracked | 0 +| 701|0x0000000565800000, 0x0000000566000000, 0x0000000566000000|100%| O| |TAMS 0x0000000565800000| PB 0x0000000565800000| Untracked | 0 +| 702|0x0000000566000000, 0x0000000566800000, 0x0000000566800000|100%| O| |TAMS 0x0000000566000000| PB 0x0000000566000000| Untracked | 0 +| 703|0x0000000566800000, 0x0000000567000000, 0x0000000567000000|100%| O| |TAMS 0x0000000566800000| PB 0x0000000566800000| Untracked | 0 +| 704|0x0000000567000000, 0x0000000567800000, 0x0000000567800000|100%| O| |TAMS 0x0000000567000000| PB 0x0000000567000000| Untracked | 0 +| 705|0x0000000567800000, 0x0000000568000000, 0x0000000568000000|100%| O| |TAMS 0x0000000567800000| PB 0x0000000567800000| Untracked | 0 +| 706|0x0000000568000000, 0x0000000568800000, 0x0000000568800000|100%| O| |TAMS 0x0000000568000000| PB 0x0000000568000000| Untracked | 0 +| 707|0x0000000568800000, 0x0000000569000000, 0x0000000569000000|100%| O| |TAMS 0x0000000568800000| PB 0x0000000568800000| Untracked | 0 +| 708|0x0000000569000000, 0x0000000569800000, 0x0000000569800000|100%| O| |TAMS 0x0000000569000000| PB 0x0000000569000000| Untracked | 0 +| 709|0x0000000569800000, 0x000000056a000000, 0x000000056a000000|100%| O| |TAMS 0x0000000569800000| PB 0x0000000569800000| Untracked | 0 +| 710|0x000000056a000000, 0x000000056a800000, 0x000000056a800000|100%| O| |TAMS 0x000000056a000000| PB 0x000000056a000000| Untracked | 0 +| 711|0x000000056a800000, 0x000000056b000000, 0x000000056b000000|100%| O| |TAMS 0x000000056a800000| PB 0x000000056a800000| Untracked | 0 +| 712|0x000000056b000000, 0x000000056b800000, 0x000000056b800000|100%| O| |TAMS 0x000000056b000000| PB 0x000000056b000000| Untracked | 0 +| 713|0x000000056b800000, 0x000000056c000000, 0x000000056c000000|100%| O| |TAMS 0x000000056b800000| PB 0x000000056b800000| Untracked | 0 +| 714|0x000000056c000000, 0x000000056c800000, 0x000000056c800000|100%| O| |TAMS 0x000000056c000000| PB 0x000000056c000000| Untracked | 0 +| 715|0x000000056c800000, 0x000000056d000000, 0x000000056d000000|100%| O| |TAMS 0x000000056c800000| PB 0x000000056c800000| Untracked | 0 +| 716|0x000000056d000000, 0x000000056d800000, 0x000000056d800000|100%| O| |TAMS 0x000000056d000000| PB 0x000000056d000000| Untracked | 0 +| 717|0x000000056d800000, 0x000000056e000000, 0x000000056e000000|100%| O| |TAMS 0x000000056d800000| PB 0x000000056d800000| Untracked | 0 +| 718|0x000000056e000000, 0x000000056e800000, 0x000000056e800000|100%| O| |TAMS 0x000000056e000000| PB 0x000000056e000000| Untracked | 0 +| 719|0x000000056e800000, 0x000000056f000000, 0x000000056f000000|100%| O| |TAMS 0x000000056e800000| PB 0x000000056e800000| Untracked | 0 +| 720|0x000000056f000000, 0x000000056f800000, 0x000000056f800000|100%| O| |TAMS 0x000000056f000000| PB 0x000000056f000000| Untracked | 0 +| 721|0x000000056f800000, 0x0000000570000000, 0x0000000570000000|100%| O| |TAMS 0x000000056f800000| PB 0x000000056f800000| Untracked | 0 +| 722|0x0000000570000000, 0x0000000570800000, 0x0000000570800000|100%| O| |TAMS 0x0000000570000000| PB 0x0000000570000000| Untracked | 0 +| 723|0x0000000570800000, 0x0000000571000000, 0x0000000571000000|100%| O| |TAMS 0x0000000570800000| PB 0x0000000570800000| Untracked | 0 +| 724|0x0000000571000000, 0x0000000571800000, 0x0000000571800000|100%| O| |TAMS 0x0000000571000000| PB 0x0000000571000000| Untracked | 0 +| 725|0x0000000571800000, 0x0000000572000000, 0x0000000572000000|100%| O| |TAMS 0x0000000571800000| PB 0x0000000571800000| Untracked | 0 +| 726|0x0000000572000000, 0x0000000572800000, 0x0000000572800000|100%| O| |TAMS 0x0000000572000000| PB 0x0000000572000000| Untracked | 0 +| 727|0x0000000572800000, 0x0000000573000000, 0x0000000573000000|100%| O| |TAMS 0x0000000572800000| PB 0x0000000572800000| Untracked | 0 +| 728|0x0000000573000000, 0x0000000573800000, 0x0000000573800000|100%| O| |TAMS 0x0000000573000000| PB 0x0000000573000000| Untracked | 0 +| 729|0x0000000573800000, 0x0000000574000000, 0x0000000574000000|100%| O| |TAMS 0x0000000573800000| PB 0x0000000573800000| Untracked | 0 +| 730|0x0000000574000000, 0x0000000574800000, 0x0000000574800000|100%| O| |TAMS 0x0000000574000000| PB 0x0000000574000000| Untracked | 0 +| 731|0x0000000574800000, 0x0000000575000000, 0x0000000575000000|100%| O| |TAMS 0x0000000574800000| PB 0x0000000574800000| Untracked | 0 +| 732|0x0000000575000000, 0x0000000575800000, 0x0000000575800000|100%| O| |TAMS 0x0000000575000000| PB 0x0000000575000000| Untracked | 0 +| 733|0x0000000575800000, 0x0000000576000000, 0x0000000576000000|100%| O| |TAMS 0x0000000575800000| PB 0x0000000575800000| Untracked | 0 +| 734|0x0000000576000000, 0x0000000576800000, 0x0000000576800000|100%| O| |TAMS 0x0000000576000000| PB 0x0000000576000000| Untracked | 0 +| 735|0x0000000576800000, 0x0000000577000000, 0x0000000577000000|100%| O| |TAMS 0x0000000576800000| PB 0x0000000576800000| Untracked | 0 +| 736|0x0000000577000000, 0x0000000577800000, 0x0000000577800000|100%| O| |TAMS 0x0000000577000000| PB 0x0000000577000000| Untracked | 0 +| 737|0x0000000577800000, 0x0000000578000000, 0x0000000578000000|100%| O| |TAMS 0x0000000577800000| PB 0x0000000577800000| Untracked | 0 +| 738|0x0000000578000000, 0x0000000578800000, 0x0000000578800000|100%| O| |TAMS 0x0000000578000000| PB 0x0000000578000000| Untracked | 0 +| 739|0x0000000578800000, 0x0000000579000000, 0x0000000579000000|100%| O| |TAMS 0x0000000578800000| PB 0x0000000578800000| Untracked | 0 +| 740|0x0000000579000000, 0x0000000579800000, 0x0000000579800000|100%| O| |TAMS 0x0000000579000000| PB 0x0000000579000000| Untracked | 0 +| 741|0x0000000579800000, 0x000000057a000000, 0x000000057a000000|100%| O| |TAMS 0x0000000579800000| PB 0x0000000579800000| Untracked | 0 +| 742|0x000000057a000000, 0x000000057a800000, 0x000000057a800000|100%| O| |TAMS 0x000000057a000000| PB 0x000000057a000000| Untracked | 0 +| 743|0x000000057a800000, 0x000000057b000000, 0x000000057b000000|100%| O| |TAMS 0x000000057a800000| PB 0x000000057a800000| Untracked | 0 +| 744|0x000000057b000000, 0x000000057b800000, 0x000000057b800000|100%| O| |TAMS 0x000000057b000000| PB 0x000000057b000000| Untracked | 0 +| 745|0x000000057b800000, 0x000000057c000000, 0x000000057c000000|100%| O| |TAMS 0x000000057b800000| PB 0x000000057b800000| Untracked | 0 +| 746|0x000000057c000000, 0x000000057c800000, 0x000000057c800000|100%| O| |TAMS 0x000000057c000000| PB 0x000000057c000000| Untracked | 0 +| 747|0x000000057c800000, 0x000000057d000000, 0x000000057d000000|100%| O| |TAMS 0x000000057c800000| PB 0x000000057c800000| Untracked | 0 +| 748|0x000000057d000000, 0x000000057d800000, 0x000000057d800000|100%| O| |TAMS 0x000000057d000000| PB 0x000000057d000000| Untracked | 0 +| 749|0x000000057d800000, 0x000000057e000000, 0x000000057e000000|100%| O| |TAMS 0x000000057d800000| PB 0x000000057d800000| Untracked | 0 +| 750|0x000000057e000000, 0x000000057e800000, 0x000000057e800000|100%| O| |TAMS 0x000000057e000000| PB 0x000000057e000000| Untracked | 0 +| 751|0x000000057e800000, 0x000000057f000000, 0x000000057f000000|100%| O| |TAMS 0x000000057e800000| PB 0x000000057e800000| Untracked | 0 +| 752|0x000000057f000000, 0x000000057f800000, 0x000000057f800000|100%| O| |TAMS 0x000000057f000000| PB 0x000000057f000000| Untracked | 0 +| 753|0x000000057f800000, 0x0000000580000000, 0x0000000580000000|100%| O| |TAMS 0x000000057f800000| PB 0x000000057f800000| Untracked | 0 +| 754|0x0000000580000000, 0x0000000580800000, 0x0000000580800000|100%| O| |TAMS 0x0000000580000000| PB 0x0000000580000000| Untracked | 0 +| 755|0x0000000580800000, 0x0000000581000000, 0x0000000581000000|100%| O| |TAMS 0x0000000580800000| PB 0x0000000580800000| Untracked | 0 +| 756|0x0000000581000000, 0x0000000581800000, 0x0000000581800000|100%| O| |TAMS 0x0000000581000000| PB 0x0000000581000000| Untracked | 0 +| 757|0x0000000581800000, 0x0000000582000000, 0x0000000582000000|100%| O| |TAMS 0x0000000581800000| PB 0x0000000581800000| Untracked | 0 +| 758|0x0000000582000000, 0x0000000582800000, 0x0000000582800000|100%| O| |TAMS 0x0000000582000000| PB 0x0000000582000000| Untracked | 0 +| 759|0x0000000582800000, 0x0000000583000000, 0x0000000583000000|100%| O| |TAMS 0x0000000582800000| PB 0x0000000582800000| Untracked | 0 +| 760|0x0000000583000000, 0x0000000583800000, 0x0000000583800000|100%| O| |TAMS 0x0000000583000000| PB 0x0000000583000000| Untracked | 0 +| 761|0x0000000583800000, 0x0000000584000000, 0x0000000584000000|100%| O| |TAMS 0x0000000583800000| PB 0x0000000583800000| Untracked | 0 +| 762|0x0000000584000000, 0x0000000584800000, 0x0000000584800000|100%| O| |TAMS 0x0000000584000000| PB 0x0000000584000000| Untracked | 0 +| 763|0x0000000584800000, 0x0000000585000000, 0x0000000585000000|100%| O| |TAMS 0x0000000584800000| PB 0x0000000584800000| Untracked | 0 +| 764|0x0000000585000000, 0x0000000585800000, 0x0000000585800000|100%| O| |TAMS 0x0000000585000000| PB 0x0000000585000000| Untracked | 0 +| 765|0x0000000585800000, 0x0000000586000000, 0x0000000586000000|100%| O| |TAMS 0x0000000585800000| PB 0x0000000585800000| Untracked | 0 +| 766|0x0000000586000000, 0x0000000586800000, 0x0000000586800000|100%| O| |TAMS 0x0000000586000000| PB 0x0000000586000000| Untracked | 0 +| 767|0x0000000586800000, 0x0000000587000000, 0x0000000587000000|100%| O| |TAMS 0x0000000586800000| PB 0x0000000586800000| Untracked | 0 +| 768|0x0000000587000000, 0x0000000587800000, 0x0000000587800000|100%| O| |TAMS 0x0000000587000000| PB 0x0000000587000000| Untracked | 0 +| 769|0x0000000587800000, 0x0000000588000000, 0x0000000588000000|100%| O| |TAMS 0x0000000587800000| PB 0x0000000587800000| Untracked | 0 +| 770|0x0000000588000000, 0x0000000588800000, 0x0000000588800000|100%| O| |TAMS 0x0000000588000000| PB 0x0000000588000000| Untracked | 0 +| 771|0x0000000588800000, 0x0000000589000000, 0x0000000589000000|100%| O| |TAMS 0x0000000588800000| PB 0x0000000588800000| Untracked | 0 +| 772|0x0000000589000000, 0x0000000589800000, 0x0000000589800000|100%| O| |TAMS 0x0000000589000000| PB 0x0000000589000000| Untracked | 0 +| 773|0x0000000589800000, 0x000000058a000000, 0x000000058a000000|100%| O| |TAMS 0x0000000589800000| PB 0x0000000589800000| Untracked | 0 +| 774|0x000000058a000000, 0x000000058a800000, 0x000000058a800000|100%| O| |TAMS 0x000000058a000000| PB 0x000000058a000000| Untracked | 0 +| 775|0x000000058a800000, 0x000000058b000000, 0x000000058b000000|100%| O| |TAMS 0x000000058a800000| PB 0x000000058a800000| Untracked | 0 +| 776|0x000000058b000000, 0x000000058b800000, 0x000000058b800000|100%| O| |TAMS 0x000000058b000000| PB 0x000000058b000000| Untracked | 0 +| 777|0x000000058b800000, 0x000000058c000000, 0x000000058c000000|100%| O| |TAMS 0x000000058b800000| PB 0x000000058b800000| Untracked | 0 +| 778|0x000000058c000000, 0x000000058c800000, 0x000000058c800000|100%| O| |TAMS 0x000000058c000000| PB 0x000000058c000000| Untracked | 0 +| 779|0x000000058c800000, 0x000000058d000000, 0x000000058d000000|100%| O| |TAMS 0x000000058c800000| PB 0x000000058c800000| Untracked | 0 +| 780|0x000000058d000000, 0x000000058d800000, 0x000000058d800000|100%| O| |TAMS 0x000000058d000000| PB 0x000000058d000000| Untracked | 0 +| 781|0x000000058d800000, 0x000000058e000000, 0x000000058e000000|100%| O| |TAMS 0x000000058d800000| PB 0x000000058d800000| Untracked | 0 +| 782|0x000000058e000000, 0x000000058e800000, 0x000000058e800000|100%| O| |TAMS 0x000000058e000000| PB 0x000000058e000000| Untracked | 0 +| 783|0x000000058e800000, 0x000000058f000000, 0x000000058f000000|100%| O| |TAMS 0x000000058e800000| PB 0x000000058e800000| Untracked | 0 +| 784|0x000000058f000000, 0x000000058f800000, 0x000000058f800000|100%| O| |TAMS 0x000000058f000000| PB 0x000000058f000000| Untracked | 0 +| 785|0x000000058f800000, 0x0000000590000000, 0x0000000590000000|100%| O| |TAMS 0x000000058f800000| PB 0x000000058f800000| Untracked | 0 +| 786|0x0000000590000000, 0x0000000590800000, 0x0000000590800000|100%| O| |TAMS 0x0000000590000000| PB 0x0000000590000000| Untracked | 0 +| 787|0x0000000590800000, 0x0000000591000000, 0x0000000591000000|100%| O| |TAMS 0x0000000590800000| PB 0x0000000590800000| Untracked | 0 +| 788|0x0000000591000000, 0x0000000591800000, 0x0000000591800000|100%| O| |TAMS 0x0000000591000000| PB 0x0000000591000000| Untracked | 0 +| 789|0x0000000591800000, 0x0000000592000000, 0x0000000592000000|100%| O| |TAMS 0x0000000591800000| PB 0x0000000591800000| Untracked | 0 +| 790|0x0000000592000000, 0x0000000592800000, 0x0000000592800000|100%| O| |TAMS 0x0000000592000000| PB 0x0000000592000000| Untracked | 0 +| 791|0x0000000592800000, 0x0000000593000000, 0x0000000593000000|100%| O| |TAMS 0x0000000592800000| PB 0x0000000592800000| Untracked | 0 +| 792|0x0000000593000000, 0x0000000593800000, 0x0000000593800000|100%| O| |TAMS 0x0000000593000000| PB 0x0000000593000000| Untracked | 0 +| 793|0x0000000593800000, 0x0000000594000000, 0x0000000594000000|100%| O| |TAMS 0x0000000593800000| PB 0x0000000593800000| Untracked | 0 +| 794|0x0000000594000000, 0x0000000594800000, 0x0000000594800000|100%| O| |TAMS 0x0000000594000000| PB 0x0000000594000000| Untracked | 0 +| 795|0x0000000594800000, 0x0000000595000000, 0x0000000595000000|100%| O| |TAMS 0x0000000594800000| PB 0x0000000594800000| Untracked | 0 +| 796|0x0000000595000000, 0x0000000595800000, 0x0000000595800000|100%| O| |TAMS 0x0000000595000000| PB 0x0000000595000000| Untracked | 0 +| 797|0x0000000595800000, 0x0000000596000000, 0x0000000596000000|100%| O| |TAMS 0x0000000595800000| PB 0x0000000595800000| Untracked | 0 +| 798|0x0000000596000000, 0x0000000596800000, 0x0000000596800000|100%| O| |TAMS 0x0000000596000000| PB 0x0000000596000000| Untracked | 0 +| 799|0x0000000596800000, 0x0000000597000000, 0x0000000597000000|100%| O| |TAMS 0x0000000596800000| PB 0x0000000596800000| Untracked | 0 +| 800|0x0000000597000000, 0x0000000597800000, 0x0000000597800000|100%| O| |TAMS 0x0000000597000000| PB 0x0000000597000000| Untracked | 0 +| 801|0x0000000597800000, 0x0000000598000000, 0x0000000598000000|100%| O| |TAMS 0x0000000597800000| PB 0x0000000597800000| Untracked | 0 +| 802|0x0000000598000000, 0x0000000598800000, 0x0000000598800000|100%| O| |TAMS 0x0000000598000000| PB 0x0000000598000000| Untracked | 0 +| 803|0x0000000598800000, 0x0000000599000000, 0x0000000599000000|100%| O| |TAMS 0x0000000598800000| PB 0x0000000598800000| Untracked | 0 +| 804|0x0000000599000000, 0x0000000599800000, 0x0000000599800000|100%| O| |TAMS 0x0000000599000000| PB 0x0000000599000000| Untracked | 0 +| 805|0x0000000599800000, 0x000000059a000000, 0x000000059a000000|100%| O| |TAMS 0x0000000599800000| PB 0x0000000599800000| Untracked | 0 +| 806|0x000000059a000000, 0x000000059a800000, 0x000000059a800000|100%| O| |TAMS 0x000000059a000000| PB 0x000000059a000000| Untracked | 0 +| 807|0x000000059a800000, 0x000000059b000000, 0x000000059b000000|100%| O| |TAMS 0x000000059a800000| PB 0x000000059a800000| Untracked | 0 +| 808|0x000000059b000000, 0x000000059b800000, 0x000000059b800000|100%| O| |TAMS 0x000000059b000000| PB 0x000000059b000000| Untracked | 0 +| 809|0x000000059b800000, 0x000000059c000000, 0x000000059c000000|100%| O| |TAMS 0x000000059b800000| PB 0x000000059b800000| Untracked | 0 +| 810|0x000000059c000000, 0x000000059c800000, 0x000000059c800000|100%| O| |TAMS 0x000000059c000000| PB 0x000000059c000000| Untracked | 0 +| 811|0x000000059c800000, 0x000000059d000000, 0x000000059d000000|100%| O| |TAMS 0x000000059c800000| PB 0x000000059c800000| Untracked | 0 +| 812|0x000000059d000000, 0x000000059d800000, 0x000000059d800000|100%| O| |TAMS 0x000000059d000000| PB 0x000000059d000000| Untracked | 0 +| 813|0x000000059d800000, 0x000000059e000000, 0x000000059e000000|100%| O| |TAMS 0x000000059d800000| PB 0x000000059d800000| Untracked | 0 +| 814|0x000000059e000000, 0x000000059e800000, 0x000000059e800000|100%| O| |TAMS 0x000000059e000000| PB 0x000000059e000000| Untracked | 0 +| 815|0x000000059e800000, 0x000000059f000000, 0x000000059f000000|100%| O| |TAMS 0x000000059e800000| PB 0x000000059e800000| Untracked | 0 +| 816|0x000000059f000000, 0x000000059f800000, 0x000000059f800000|100%| O| |TAMS 0x000000059f000000| PB 0x000000059f000000| Untracked | 0 +| 817|0x000000059f800000, 0x00000005a0000000, 0x00000005a0000000|100%| O| |TAMS 0x000000059f800000| PB 0x000000059f800000| Untracked | 0 +| 818|0x00000005a0000000, 0x00000005a0800000, 0x00000005a0800000|100%| O| |TAMS 0x00000005a0000000| PB 0x00000005a0000000| Untracked | 0 +| 819|0x00000005a0800000, 0x00000005a1000000, 0x00000005a1000000|100%| O| |TAMS 0x00000005a0800000| PB 0x00000005a0800000| Untracked | 0 +| 820|0x00000005a1000000, 0x00000005a1800000, 0x00000005a1800000|100%| O| |TAMS 0x00000005a1000000| PB 0x00000005a1000000| Untracked | 0 +| 821|0x00000005a1800000, 0x00000005a2000000, 0x00000005a2000000|100%| O| |TAMS 0x00000005a1800000| PB 0x00000005a1800000| Untracked | 0 +| 822|0x00000005a2000000, 0x00000005a2800000, 0x00000005a2800000|100%| O| |TAMS 0x00000005a2000000| PB 0x00000005a2000000| Untracked | 0 +| 823|0x00000005a2800000, 0x00000005a3000000, 0x00000005a3000000|100%| O| |TAMS 0x00000005a2800000| PB 0x00000005a2800000| Untracked | 0 +| 824|0x00000005a3000000, 0x00000005a3800000, 0x00000005a3800000|100%| O| |TAMS 0x00000005a3000000| PB 0x00000005a3000000| Untracked | 0 +| 825|0x00000005a3800000, 0x00000005a4000000, 0x00000005a4000000|100%| O| |TAMS 0x00000005a3800000| PB 0x00000005a3800000| Untracked | 0 +| 826|0x00000005a4000000, 0x00000005a4800000, 0x00000005a4800000|100%| O| |TAMS 0x00000005a4000000| PB 0x00000005a4000000| Untracked | 0 +| 827|0x00000005a4800000, 0x00000005a5000000, 0x00000005a5000000|100%| O| |TAMS 0x00000005a4800000| PB 0x00000005a4800000| Untracked | 0 +| 828|0x00000005a5000000, 0x00000005a5800000, 0x00000005a5800000|100%| O| |TAMS 0x00000005a5000000| PB 0x00000005a5000000| Untracked | 0 +| 829|0x00000005a5800000, 0x00000005a6000000, 0x00000005a6000000|100%| O| |TAMS 0x00000005a5800000| PB 0x00000005a5800000| Untracked | 0 +| 830|0x00000005a6000000, 0x00000005a6800000, 0x00000005a6800000|100%| O| |TAMS 0x00000005a6000000| PB 0x00000005a6000000| Untracked | 0 +| 831|0x00000005a6800000, 0x00000005a7000000, 0x00000005a7000000|100%| O| |TAMS 0x00000005a6800000| PB 0x00000005a6800000| Untracked | 0 +| 832|0x00000005a7000000, 0x00000005a7800000, 0x00000005a7800000|100%| O| |TAMS 0x00000005a7000000| PB 0x00000005a7000000| Untracked | 0 +| 833|0x00000005a7800000, 0x00000005a8000000, 0x00000005a8000000|100%| O| |TAMS 0x00000005a7800000| PB 0x00000005a7800000| Untracked | 0 +| 834|0x00000005a8000000, 0x00000005a8800000, 0x00000005a8800000|100%| O| |TAMS 0x00000005a8000000| PB 0x00000005a8000000| Untracked | 0 +| 835|0x00000005a8800000, 0x00000005a9000000, 0x00000005a9000000|100%| O| |TAMS 0x00000005a8800000| PB 0x00000005a8800000| Untracked | 0 +| 836|0x00000005a9000000, 0x00000005a9800000, 0x00000005a9800000|100%| O| |TAMS 0x00000005a9000000| PB 0x00000005a9000000| Untracked | 0 +| 837|0x00000005a9800000, 0x00000005aa000000, 0x00000005aa000000|100%| O| |TAMS 0x00000005a9800000| PB 0x00000005a9800000| Untracked | 0 +| 838|0x00000005aa000000, 0x00000005aa800000, 0x00000005aa800000|100%| O| |TAMS 0x00000005aa000000| PB 0x00000005aa000000| Untracked | 0 +| 839|0x00000005aa800000, 0x00000005ab000000, 0x00000005ab000000|100%| O| |TAMS 0x00000005aa800000| PB 0x00000005aa800000| Untracked | 0 +| 840|0x00000005ab000000, 0x00000005ab800000, 0x00000005ab800000|100%| O| |TAMS 0x00000005ab000000| PB 0x00000005ab000000| Untracked | 0 +| 841|0x00000005ab800000, 0x00000005ac000000, 0x00000005ac000000|100%| O| |TAMS 0x00000005ab800000| PB 0x00000005ab800000| Untracked | 0 +| 842|0x00000005ac000000, 0x00000005ac800000, 0x00000005ac800000|100%| O| |TAMS 0x00000005ac000000| PB 0x00000005ac000000| Untracked | 0 +| 843|0x00000005ac800000, 0x00000005ad000000, 0x00000005ad000000|100%| O| |TAMS 0x00000005ac800000| PB 0x00000005ac800000| Untracked | 0 +| 844|0x00000005ad000000, 0x00000005ad800000, 0x00000005ad800000|100%| O| |TAMS 0x00000005ad000000| PB 0x00000005ad000000| Untracked | 0 +| 845|0x00000005ad800000, 0x00000005ae000000, 0x00000005ae000000|100%| O| |TAMS 0x00000005ad800000| PB 0x00000005ad800000| Untracked | 0 +| 846|0x00000005ae000000, 0x00000005ae800000, 0x00000005ae800000|100%| O| |TAMS 0x00000005ae000000| PB 0x00000005ae000000| Untracked | 0 +| 847|0x00000005ae800000, 0x00000005af000000, 0x00000005af000000|100%| O| |TAMS 0x00000005ae800000| PB 0x00000005ae800000| Untracked | 0 +| 848|0x00000005af000000, 0x00000005af800000, 0x00000005af800000|100%| O| |TAMS 0x00000005af000000| PB 0x00000005af000000| Untracked | 0 +| 849|0x00000005af800000, 0x00000005b0000000, 0x00000005b0000000|100%| O| |TAMS 0x00000005af800000| PB 0x00000005af800000| Untracked | 0 +| 850|0x00000005b0000000, 0x00000005b0800000, 0x00000005b0800000|100%| O| |TAMS 0x00000005b0000000| PB 0x00000005b0000000| Untracked | 0 +| 851|0x00000005b0800000, 0x00000005b1000000, 0x00000005b1000000|100%| O| |TAMS 0x00000005b0800000| PB 0x00000005b0800000| Untracked | 0 +| 852|0x00000005b1000000, 0x00000005b1800000, 0x00000005b1800000|100%| O| |TAMS 0x00000005b1000000| PB 0x00000005b1000000| Untracked | 0 +| 853|0x00000005b1800000, 0x00000005b2000000, 0x00000005b2000000|100%| O| |TAMS 0x00000005b1800000| PB 0x00000005b1800000| Untracked | 0 +| 854|0x00000005b2000000, 0x00000005b2800000, 0x00000005b2800000|100%| O| |TAMS 0x00000005b2000000| PB 0x00000005b2000000| Untracked | 0 +| 855|0x00000005b2800000, 0x00000005b3000000, 0x00000005b3000000|100%| O| |TAMS 0x00000005b2800000| PB 0x00000005b2800000| Untracked | 0 +| 856|0x00000005b3000000, 0x00000005b3800000, 0x00000005b3800000|100%| O| |TAMS 0x00000005b3000000| PB 0x00000005b3000000| Untracked | 0 +| 857|0x00000005b3800000, 0x00000005b4000000, 0x00000005b4000000|100%| O| |TAMS 0x00000005b3800000| PB 0x00000005b3800000| Untracked | 0 +| 858|0x00000005b4000000, 0x00000005b4800000, 0x00000005b4800000|100%| O| |TAMS 0x00000005b4000000| PB 0x00000005b4000000| Untracked | 0 +| 859|0x00000005b4800000, 0x00000005b5000000, 0x00000005b5000000|100%| O| |TAMS 0x00000005b4800000| PB 0x00000005b4800000| Untracked | 0 +| 860|0x00000005b5000000, 0x00000005b5800000, 0x00000005b5800000|100%| O| |TAMS 0x00000005b5000000| PB 0x00000005b5000000| Untracked | 0 +| 861|0x00000005b5800000, 0x00000005b6000000, 0x00000005b6000000|100%| O| |TAMS 0x00000005b5800000| PB 0x00000005b5800000| Untracked | 0 +| 862|0x00000005b6000000, 0x00000005b6800000, 0x00000005b6800000|100%| O| |TAMS 0x00000005b6000000| PB 0x00000005b6000000| Untracked | 0 +| 863|0x00000005b6800000, 0x00000005b7000000, 0x00000005b7000000|100%| O| |TAMS 0x00000005b6800000| PB 0x00000005b6800000| Untracked | 0 +| 864|0x00000005b7000000, 0x00000005b7800000, 0x00000005b7800000|100%| O| |TAMS 0x00000005b7000000| PB 0x00000005b7000000| Untracked | 0 +| 865|0x00000005b7800000, 0x00000005b8000000, 0x00000005b8000000|100%| O| |TAMS 0x00000005b7800000| PB 0x00000005b7800000| Untracked | 0 +| 866|0x00000005b8000000, 0x00000005b8800000, 0x00000005b8800000|100%| O| |TAMS 0x00000005b8000000| PB 0x00000005b8000000| Untracked | 0 +| 867|0x00000005b8800000, 0x00000005b89a1208, 0x00000005b9000000| 20%| O| |TAMS 0x00000005b8800000| PB 0x00000005b8800000| Untracked | 0 +| 868|0x00000005b9000000, 0x00000005b9000000, 0x00000005b9800000| 0%| F| |TAMS 0x00000005b9000000| PB 0x00000005b9000000| Untracked | 0 +| 869|0x00000005b9800000, 0x00000005b9800000, 0x00000005ba000000| 0%| F| |TAMS 0x00000005b9800000| PB 0x00000005b9800000| Untracked | 0 +| 870|0x00000005ba000000, 0x00000005ba000000, 0x00000005ba800000| 0%| F| |TAMS 0x00000005ba000000| PB 0x00000005ba000000| Untracked | 0 +| 871|0x00000005ba800000, 0x00000005ba800000, 0x00000005bb000000| 0%| F| |TAMS 0x00000005ba800000| PB 0x00000005ba800000| Untracked | 0 +| 872|0x00000005bb000000, 0x00000005bb000000, 0x00000005bb800000| 0%| F| |TAMS 0x00000005bb000000| PB 0x00000005bb000000| Untracked | 0 +| 873|0x00000005bb800000, 0x00000005bb800000, 0x00000005bc000000| 0%| F| |TAMS 0x00000005bb800000| PB 0x00000005bb800000| Untracked | 0 +| 874|0x00000005bc000000, 0x00000005bc000000, 0x00000005bc800000| 0%| F| |TAMS 0x00000005bc000000| PB 0x00000005bc000000| Untracked | 0 +| 875|0x00000005bc800000, 0x00000005bc800000, 0x00000005bd000000| 0%| F| |TAMS 0x00000005bc800000| PB 0x00000005bc800000| Untracked | 0 +| 876|0x00000005bd000000, 0x00000005bd000000, 0x00000005bd800000| 0%| F| |TAMS 0x00000005bd000000| PB 0x00000005bd000000| Untracked | 0 +| 877|0x00000005bd800000, 0x00000005bd800000, 0x00000005be000000| 0%| F| |TAMS 0x00000005bd800000| PB 0x00000005bd800000| Untracked | 0 +| 878|0x00000005be000000, 0x00000005be000000, 0x00000005be800000| 0%| F| |TAMS 0x00000005be000000| PB 0x00000005be000000| Untracked | 0 +| 879|0x00000005be800000, 0x00000005be800000, 0x00000005bf000000| 0%| F| |TAMS 0x00000005be800000| PB 0x00000005be800000| Untracked | 0 +| 880|0x00000005bf000000, 0x00000005bf000000, 0x00000005bf800000| 0%| F| |TAMS 0x00000005bf000000| PB 0x00000005bf000000| Untracked | 0 +| 881|0x00000005bf800000, 0x00000005bf800000, 0x00000005c0000000| 0%| F| |TAMS 0x00000005bf800000| PB 0x00000005bf800000| Untracked | 0 +| 882|0x00000005c0000000, 0x00000005c0000000, 0x00000005c0800000| 0%| F| |TAMS 0x00000005c0000000| PB 0x00000005c0000000| Untracked | 0 +| 883|0x00000005c0800000, 0x00000005c0800000, 0x00000005c1000000| 0%| F| |TAMS 0x00000005c0800000| PB 0x00000005c0800000| Untracked | 0 +| 884|0x00000005c1000000, 0x00000005c1000000, 0x00000005c1800000| 0%| F| |TAMS 0x00000005c1000000| PB 0x00000005c1000000| Untracked | 0 +| 885|0x00000005c1800000, 0x00000005c1800000, 0x00000005c2000000| 0%| F| |TAMS 0x00000005c1800000| PB 0x00000005c1800000| Untracked | 0 +| 886|0x00000005c2000000, 0x00000005c2000000, 0x00000005c2800000| 0%| F| |TAMS 0x00000005c2000000| PB 0x00000005c2000000| Untracked | 0 +| 887|0x00000005c2800000, 0x00000005c2800000, 0x00000005c3000000| 0%| F| |TAMS 0x00000005c2800000| PB 0x00000005c2800000| Untracked | 0 +| 888|0x00000005c3000000, 0x00000005c3000000, 0x00000005c3800000| 0%| F| |TAMS 0x00000005c3000000| PB 0x00000005c3000000| Untracked | 0 +| 889|0x00000005c3800000, 0x00000005c3800000, 0x00000005c4000000| 0%| F| |TAMS 0x00000005c3800000| PB 0x00000005c3800000| Untracked | 0 +| 890|0x00000005c4000000, 0x00000005c4000000, 0x00000005c4800000| 0%| F| |TAMS 0x00000005c4000000| PB 0x00000005c4000000| Untracked | 0 +| 891|0x00000005c4800000, 0x00000005c4800000, 0x00000005c5000000| 0%| F| |TAMS 0x00000005c4800000| PB 0x00000005c4800000| Untracked | 0 +| 892|0x00000005c5000000, 0x00000005c5000000, 0x00000005c5800000| 0%| F| |TAMS 0x00000005c5000000| PB 0x00000005c5000000| Untracked | 0 +| 893|0x00000005c5800000, 0x00000005c5800000, 0x00000005c6000000| 0%| F| |TAMS 0x00000005c5800000| PB 0x00000005c5800000| Untracked | 0 +| 894|0x00000005c6000000, 0x00000005c6000000, 0x00000005c6800000| 0%| F| |TAMS 0x00000005c6000000| PB 0x00000005c6000000| Untracked | 0 +| 895|0x00000005c6800000, 0x00000005c6800000, 0x00000005c7000000| 0%| F| |TAMS 0x00000005c6800000| PB 0x00000005c6800000| Untracked | 0 +| 896|0x00000005c7000000, 0x00000005c7000000, 0x00000005c7800000| 0%| F| |TAMS 0x00000005c7000000| PB 0x00000005c7000000| Untracked | 0 +| 897|0x00000005c7800000, 0x00000005c7800000, 0x00000005c8000000| 0%| F| |TAMS 0x00000005c7800000| PB 0x00000005c7800000| Untracked | 0 +| 898|0x00000005c8000000, 0x00000005c8000000, 0x00000005c8800000| 0%| F| |TAMS 0x00000005c8000000| PB 0x00000005c8000000| Untracked | 0 +| 899|0x00000005c8800000, 0x00000005c8800000, 0x00000005c9000000| 0%| F| |TAMS 0x00000005c8800000| PB 0x00000005c8800000| Untracked | 0 +| 900|0x00000005c9000000, 0x00000005c9000000, 0x00000005c9800000| 0%| F| |TAMS 0x00000005c9000000| PB 0x00000005c9000000| Untracked | 0 +| 901|0x00000005c9800000, 0x00000005c9800000, 0x00000005ca000000| 0%| F| |TAMS 0x00000005c9800000| PB 0x00000005c9800000| Untracked | 0 +| 902|0x00000005ca000000, 0x00000005ca000000, 0x00000005ca800000| 0%| F| |TAMS 0x00000005ca000000| PB 0x00000005ca000000| Untracked | 0 +| 903|0x00000005ca800000, 0x00000005ca800000, 0x00000005cb000000| 0%| F| |TAMS 0x00000005ca800000| PB 0x00000005ca800000| Untracked | 0 +| 904|0x00000005cb000000, 0x00000005cb000000, 0x00000005cb800000| 0%| F| |TAMS 0x00000005cb000000| PB 0x00000005cb000000| Untracked | 0 +| 905|0x00000005cb800000, 0x00000005cb800000, 0x00000005cc000000| 0%| F| |TAMS 0x00000005cb800000| PB 0x00000005cb800000| Untracked | 0 +| 906|0x00000005cc000000, 0x00000005cc000000, 0x00000005cc800000| 0%| F| |TAMS 0x00000005cc000000| PB 0x00000005cc000000| Untracked | 0 +| 907|0x00000005cc800000, 0x00000005cc800000, 0x00000005cd000000| 0%| F| |TAMS 0x00000005cc800000| PB 0x00000005cc800000| Untracked | 0 +| 908|0x00000005cd000000, 0x00000005cd000000, 0x00000005cd800000| 0%| F| |TAMS 0x00000005cd000000| PB 0x00000005cd000000| Untracked | 0 +| 909|0x00000005cd800000, 0x00000005cd800000, 0x00000005ce000000| 0%| F| |TAMS 0x00000005cd800000| PB 0x00000005cd800000| Untracked | 0 +| 910|0x00000005ce000000, 0x00000005ce000000, 0x00000005ce800000| 0%| F| |TAMS 0x00000005ce000000| PB 0x00000005ce000000| Untracked | 0 +| 911|0x00000005ce800000, 0x00000005ce800000, 0x00000005cf000000| 0%| F| |TAMS 0x00000005ce800000| PB 0x00000005ce800000| Untracked | 0 +| 912|0x00000005cf000000, 0x00000005cf000000, 0x00000005cf800000| 0%| F| |TAMS 0x00000005cf000000| PB 0x00000005cf000000| Untracked | 0 +| 913|0x00000005cf800000, 0x00000005cf800000, 0x00000005d0000000| 0%| F| |TAMS 0x00000005cf800000| PB 0x00000005cf800000| Untracked | 0 +| 914|0x00000005d0000000, 0x00000005d0000000, 0x00000005d0800000| 0%| F| |TAMS 0x00000005d0000000| PB 0x00000005d0000000| Untracked | 0 +| 915|0x00000005d0800000, 0x00000005d0800000, 0x00000005d1000000| 0%| F| |TAMS 0x00000005d0800000| PB 0x00000005d0800000| Untracked | 0 +| 916|0x00000005d1000000, 0x00000005d1000000, 0x00000005d1800000| 0%| F| |TAMS 0x00000005d1000000| PB 0x00000005d1000000| Untracked | 0 +| 917|0x00000005d1800000, 0x00000005d1800000, 0x00000005d2000000| 0%| F| |TAMS 0x00000005d1800000| PB 0x00000005d1800000| Untracked | 0 +| 918|0x00000005d2000000, 0x00000005d2000000, 0x00000005d2800000| 0%| F| |TAMS 0x00000005d2000000| PB 0x00000005d2000000| Untracked | 0 +| 919|0x00000005d2800000, 0x00000005d2800000, 0x00000005d3000000| 0%| F| |TAMS 0x00000005d2800000| PB 0x00000005d2800000| Untracked | 0 +| 920|0x00000005d3000000, 0x00000005d3000000, 0x00000005d3800000| 0%| F| |TAMS 0x00000005d3000000| PB 0x00000005d3000000| Untracked | 0 +| 921|0x00000005d3800000, 0x00000005d3800000, 0x00000005d4000000| 0%| F| |TAMS 0x00000005d3800000| PB 0x00000005d3800000| Untracked | 0 +| 922|0x00000005d4000000, 0x00000005d4000000, 0x00000005d4800000| 0%| F| |TAMS 0x00000005d4000000| PB 0x00000005d4000000| Untracked | 0 +| 923|0x00000005d4800000, 0x00000005d4800000, 0x00000005d5000000| 0%| F| |TAMS 0x00000005d4800000| PB 0x00000005d4800000| Untracked | 0 +| 924|0x00000005d5000000, 0x00000005d5000000, 0x00000005d5800000| 0%| F| |TAMS 0x00000005d5000000| PB 0x00000005d5000000| Untracked | 0 +| 925|0x00000005d5800000, 0x00000005d5800000, 0x00000005d6000000| 0%| F| |TAMS 0x00000005d5800000| PB 0x00000005d5800000| Untracked | 0 +| 926|0x00000005d6000000, 0x00000005d6000000, 0x00000005d6800000| 0%| F| |TAMS 0x00000005d6000000| PB 0x00000005d6000000| Untracked | 0 +| 927|0x00000005d6800000, 0x00000005d6800000, 0x00000005d7000000| 0%| F| |TAMS 0x00000005d6800000| PB 0x00000005d6800000| Untracked | 0 +| 928|0x00000005d7000000, 0x00000005d7000000, 0x00000005d7800000| 0%| F| |TAMS 0x00000005d7000000| PB 0x00000005d7000000| Untracked | 0 +| 929|0x00000005d7800000, 0x00000005d7800000, 0x00000005d8000000| 0%| F| |TAMS 0x00000005d7800000| PB 0x00000005d7800000| Untracked | 0 +| 930|0x00000005d8000000, 0x00000005d8000000, 0x00000005d8800000| 0%| F| |TAMS 0x00000005d8000000| PB 0x00000005d8000000| Untracked | 0 +| 931|0x00000005d8800000, 0x00000005d8800000, 0x00000005d9000000| 0%| F| |TAMS 0x00000005d8800000| PB 0x00000005d8800000| Untracked | 0 +| 932|0x00000005d9000000, 0x00000005d9000000, 0x00000005d9800000| 0%| F| |TAMS 0x00000005d9000000| PB 0x00000005d9000000| Untracked | 0 +| 933|0x00000005d9800000, 0x00000005d9800000, 0x00000005da000000| 0%| F| |TAMS 0x00000005d9800000| PB 0x00000005d9800000| Untracked | 0 +| 934|0x00000005da000000, 0x00000005da000000, 0x00000005da800000| 0%| F| |TAMS 0x00000005da000000| PB 0x00000005da000000| Untracked | 0 +| 935|0x00000005da800000, 0x00000005da800000, 0x00000005db000000| 0%| F| |TAMS 0x00000005da800000| PB 0x00000005da800000| Untracked | 0 +| 936|0x00000005db000000, 0x00000005db000000, 0x00000005db800000| 0%| F| |TAMS 0x00000005db000000| PB 0x00000005db000000| Untracked | 0 +| 937|0x00000005db800000, 0x00000005db800000, 0x00000005dc000000| 0%| F| |TAMS 0x00000005db800000| PB 0x00000005db800000| Untracked | 0 +| 938|0x00000005dc000000, 0x00000005dc000000, 0x00000005dc800000| 0%| F| |TAMS 0x00000005dc000000| PB 0x00000005dc000000| Untracked | 0 +| 939|0x00000005dc800000, 0x00000005dc800000, 0x00000005dd000000| 0%| F| |TAMS 0x00000005dc800000| PB 0x00000005dc800000| Untracked | 0 +| 940|0x00000005dd000000, 0x00000005dd000000, 0x00000005dd800000| 0%| F| |TAMS 0x00000005dd000000| PB 0x00000005dd000000| Untracked | 0 +| 941|0x00000005dd800000, 0x00000005dd800000, 0x00000005de000000| 0%| F| |TAMS 0x00000005dd800000| PB 0x00000005dd800000| Untracked | 0 +| 942|0x00000005de000000, 0x00000005de000000, 0x00000005de800000| 0%| F| |TAMS 0x00000005de000000| PB 0x00000005de000000| Untracked | 0 +| 943|0x00000005de800000, 0x00000005de800000, 0x00000005df000000| 0%| F| |TAMS 0x00000005de800000| PB 0x00000005de800000| Untracked | 0 +| 944|0x00000005df000000, 0x00000005df000000, 0x00000005df800000| 0%| F| |TAMS 0x00000005df000000| PB 0x00000005df000000| Untracked | 0 +| 945|0x00000005df800000, 0x00000005df800000, 0x00000005e0000000| 0%| F| |TAMS 0x00000005df800000| PB 0x00000005df800000| Untracked | 0 +| 946|0x00000005e0000000, 0x00000005e0000000, 0x00000005e0800000| 0%| F| |TAMS 0x00000005e0000000| PB 0x00000005e0000000| Untracked | 0 +| 947|0x00000005e0800000, 0x00000005e0800000, 0x00000005e1000000| 0%| F| |TAMS 0x00000005e0800000| PB 0x00000005e0800000| Untracked | 0 +| 948|0x00000005e1000000, 0x00000005e1000000, 0x00000005e1800000| 0%| F| |TAMS 0x00000005e1000000| PB 0x00000005e1000000| Untracked | 0 +| 949|0x00000005e1800000, 0x00000005e1800000, 0x00000005e2000000| 0%| F| |TAMS 0x00000005e1800000| PB 0x00000005e1800000| Untracked | 0 +| 950|0x00000005e2000000, 0x00000005e2000000, 0x00000005e2800000| 0%| F| |TAMS 0x00000005e2000000| PB 0x00000005e2000000| Untracked | 0 +| 951|0x00000005e2800000, 0x00000005e2800000, 0x00000005e3000000| 0%| F| |TAMS 0x00000005e2800000| PB 0x00000005e2800000| Untracked | 0 +| 952|0x00000005e3000000, 0x00000005e3000000, 0x00000005e3800000| 0%| F| |TAMS 0x00000005e3000000| PB 0x00000005e3000000| Untracked | 0 +| 953|0x00000005e3800000, 0x00000005e3800000, 0x00000005e4000000| 0%| F| |TAMS 0x00000005e3800000| PB 0x00000005e3800000| Untracked | 0 +| 954|0x00000005e4000000, 0x00000005e4000000, 0x00000005e4800000| 0%| F| |TAMS 0x00000005e4000000| PB 0x00000005e4000000| Untracked | 0 +| 955|0x00000005e4800000, 0x00000005e4800000, 0x00000005e5000000| 0%| F| |TAMS 0x00000005e4800000| PB 0x00000005e4800000| Untracked | 0 +| 956|0x00000005e5000000, 0x00000005e5000000, 0x00000005e5800000| 0%| F| |TAMS 0x00000005e5000000| PB 0x00000005e5000000| Untracked | 0 +| 957|0x00000005e5800000, 0x00000005e5800000, 0x00000005e6000000| 0%| F| |TAMS 0x00000005e5800000| PB 0x00000005e5800000| Untracked | 0 +| 958|0x00000005e6000000, 0x00000005e6000000, 0x00000005e6800000| 0%| F| |TAMS 0x00000005e6000000| PB 0x00000005e6000000| Untracked | 0 +| 959|0x00000005e6800000, 0x00000005e6800000, 0x00000005e7000000| 0%| F| |TAMS 0x00000005e6800000| PB 0x00000005e6800000| Untracked | 0 +| 960|0x00000005e7000000, 0x00000005e7000000, 0x00000005e7800000| 0%| F| |TAMS 0x00000005e7000000| PB 0x00000005e7000000| Untracked | 0 +| 961|0x00000005e7800000, 0x00000005e7800000, 0x00000005e8000000| 0%| F| |TAMS 0x00000005e7800000| PB 0x00000005e7800000| Untracked | 0 +| 962|0x00000005e8000000, 0x00000005e8000000, 0x00000005e8800000| 0%| F| |TAMS 0x00000005e8000000| PB 0x00000005e8000000| Untracked | 0 +| 963|0x00000005e8800000, 0x00000005e8800000, 0x00000005e9000000| 0%| F| |TAMS 0x00000005e8800000| PB 0x00000005e8800000| Untracked | 0 +| 964|0x00000005e9000000, 0x00000005e9000000, 0x00000005e9800000| 0%| F| |TAMS 0x00000005e9000000| PB 0x00000005e9000000| Untracked | 0 +| 965|0x00000005e9800000, 0x00000005e9800000, 0x00000005ea000000| 0%| F| |TAMS 0x00000005e9800000| PB 0x00000005e9800000| Untracked | 0 +| 966|0x00000005ea000000, 0x00000005ea000000, 0x00000005ea800000| 0%| F| |TAMS 0x00000005ea000000| PB 0x00000005ea000000| Untracked | 0 +| 967|0x00000005ea800000, 0x00000005ea800000, 0x00000005eb000000| 0%| F| |TAMS 0x00000005ea800000| PB 0x00000005ea800000| Untracked | 0 +| 968|0x00000005eb000000, 0x00000005eb000000, 0x00000005eb800000| 0%| F| |TAMS 0x00000005eb000000| PB 0x00000005eb000000| Untracked | 0 +| 969|0x00000005eb800000, 0x00000005eb800000, 0x00000005ec000000| 0%| F| |TAMS 0x00000005eb800000| PB 0x00000005eb800000| Untracked | 0 +| 970|0x00000005ec000000, 0x00000005ec000000, 0x00000005ec800000| 0%| F| |TAMS 0x00000005ec000000| PB 0x00000005ec000000| Untracked | 0 +| 971|0x00000005ec800000, 0x00000005ec800000, 0x00000005ed000000| 0%| F| |TAMS 0x00000005ec800000| PB 0x00000005ec800000| Untracked | 0 +| 972|0x00000005ed000000, 0x00000005ed000000, 0x00000005ed800000| 0%| F| |TAMS 0x00000005ed000000| PB 0x00000005ed000000| Untracked | 0 +| 973|0x00000005ed800000, 0x00000005ed800000, 0x00000005ee000000| 0%| F| |TAMS 0x00000005ed800000| PB 0x00000005ed800000| Untracked | 0 +| 974|0x00000005ee000000, 0x00000005ee000000, 0x00000005ee800000| 0%| F| |TAMS 0x00000005ee000000| PB 0x00000005ee000000| Untracked | 0 +| 975|0x00000005ee800000, 0x00000005ee800000, 0x00000005ef000000| 0%| F| |TAMS 0x00000005ee800000| PB 0x00000005ee800000| Untracked | 0 +| 976|0x00000005ef000000, 0x00000005ef000000, 0x00000005ef800000| 0%| F| |TAMS 0x00000005ef000000| PB 0x00000005ef000000| Untracked | 0 +| 977|0x00000005ef800000, 0x00000005ef800000, 0x00000005f0000000| 0%| F| |TAMS 0x00000005ef800000| PB 0x00000005ef800000| Untracked | 0 +| 978|0x00000005f0000000, 0x00000005f0000000, 0x00000005f0800000| 0%| F| |TAMS 0x00000005f0000000| PB 0x00000005f0000000| Untracked | 0 +| 979|0x00000005f0800000, 0x00000005f0800000, 0x00000005f1000000| 0%| F| |TAMS 0x00000005f0800000| PB 0x00000005f0800000| Untracked | 0 +| 980|0x00000005f1000000, 0x00000005f1000000, 0x00000005f1800000| 0%| F| |TAMS 0x00000005f1000000| PB 0x00000005f1000000| Untracked | 0 +| 981|0x00000005f1800000, 0x00000005f1800000, 0x00000005f2000000| 0%| F| |TAMS 0x00000005f1800000| PB 0x00000005f1800000| Untracked | 0 +| 982|0x00000005f2000000, 0x00000005f2000000, 0x00000005f2800000| 0%| F| |TAMS 0x00000005f2000000| PB 0x00000005f2000000| Untracked | 0 +| 983|0x00000005f2800000, 0x00000005f2800000, 0x00000005f3000000| 0%| F| |TAMS 0x00000005f2800000| PB 0x00000005f2800000| Untracked | 0 +| 984|0x00000005f3000000, 0x00000005f3000000, 0x00000005f3800000| 0%| F| |TAMS 0x00000005f3000000| PB 0x00000005f3000000| Untracked | 0 +| 985|0x00000005f3800000, 0x00000005f3800000, 0x00000005f4000000| 0%| F| |TAMS 0x00000005f3800000| PB 0x00000005f3800000| Untracked | 0 +| 986|0x00000005f4000000, 0x00000005f4000000, 0x00000005f4800000| 0%| F| |TAMS 0x00000005f4000000| PB 0x00000005f4000000| Untracked | 0 +| 987|0x00000005f4800000, 0x00000005f4800000, 0x00000005f5000000| 0%| F| |TAMS 0x00000005f4800000| PB 0x00000005f4800000| Untracked | 0 +| 988|0x00000005f5000000, 0x00000005f5000000, 0x00000005f5800000| 0%| F| |TAMS 0x00000005f5000000| PB 0x00000005f5000000| Untracked | 0 +| 989|0x00000005f5800000, 0x00000005f5800000, 0x00000005f6000000| 0%| F| |TAMS 0x00000005f5800000| PB 0x00000005f5800000| Untracked | 0 +| 990|0x00000005f6000000, 0x00000005f6000000, 0x00000005f6800000| 0%| F| |TAMS 0x00000005f6000000| PB 0x00000005f6000000| Untracked | 0 +| 991|0x00000005f6800000, 0x00000005f6800000, 0x00000005f7000000| 0%| F| |TAMS 0x00000005f6800000| PB 0x00000005f6800000| Untracked | 0 +| 992|0x00000005f7000000, 0x00000005f7000000, 0x00000005f7800000| 0%| F| |TAMS 0x00000005f7000000| PB 0x00000005f7000000| Untracked | 0 +| 993|0x00000005f7800000, 0x00000005f7800000, 0x00000005f8000000| 0%| F| |TAMS 0x00000005f7800000| PB 0x00000005f7800000| Untracked | 0 +| 994|0x00000005f8000000, 0x00000005f8000000, 0x00000005f8800000| 0%| F| |TAMS 0x00000005f8000000| PB 0x00000005f8000000| Untracked | 0 +| 995|0x00000005f8800000, 0x00000005f8800000, 0x00000005f9000000| 0%| F| |TAMS 0x00000005f8800000| PB 0x00000005f8800000| Untracked | 0 +| 996|0x00000005f9000000, 0x00000005f9000000, 0x00000005f9800000| 0%| F| |TAMS 0x00000005f9000000| PB 0x00000005f9000000| Untracked | 0 +| 997|0x00000005f9800000, 0x00000005f9800000, 0x00000005fa000000| 0%| F| |TAMS 0x00000005f9800000| PB 0x00000005f9800000| Untracked | 0 +| 998|0x00000005fa000000, 0x00000005fa000000, 0x00000005fa800000| 0%| F| |TAMS 0x00000005fa000000| PB 0x00000005fa000000| Untracked | 0 +| 999|0x00000005fa800000, 0x00000005fa800000, 0x00000005fb000000| 0%| F| |TAMS 0x00000005fa800000| PB 0x00000005fa800000| Untracked | 0 +|1000|0x00000005fb000000, 0x00000005fb000000, 0x00000005fb800000| 0%| F| |TAMS 0x00000005fb000000| PB 0x00000005fb000000| Untracked | 0 +|1001|0x00000005fb800000, 0x00000005fb800000, 0x00000005fc000000| 0%| F| |TAMS 0x00000005fb800000| PB 0x00000005fb800000| Untracked | 0 +|1002|0x00000005fc000000, 0x00000005fc000000, 0x00000005fc800000| 0%| F| |TAMS 0x00000005fc000000| PB 0x00000005fc000000| Untracked | 0 +|1003|0x00000005fc800000, 0x00000005fc800000, 0x00000005fd000000| 0%| F| |TAMS 0x00000005fc800000| PB 0x00000005fc800000| Untracked | 0 +|1004|0x00000005fd000000, 0x00000005fd000000, 0x00000005fd800000| 0%| F| |TAMS 0x00000005fd000000| PB 0x00000005fd000000| Untracked | 0 +|1005|0x00000005fd800000, 0x00000005fd800000, 0x00000005fe000000| 0%| F| |TAMS 0x00000005fd800000| PB 0x00000005fd800000| Untracked | 0 +|1006|0x00000005fe000000, 0x00000005fe000000, 0x00000005fe800000| 0%| F| |TAMS 0x00000005fe000000| PB 0x00000005fe000000| Untracked | 0 +|1007|0x00000005fe800000, 0x00000005fe800000, 0x00000005ff000000| 0%| F| |TAMS 0x00000005fe800000| PB 0x00000005fe800000| Untracked | 0 +|1008|0x00000005ff000000, 0x00000005ff000000, 0x00000005ff800000| 0%| F| |TAMS 0x00000005ff000000| PB 0x00000005ff000000| Untracked | 0 +|1009|0x00000005ff800000, 0x00000005ff800000, 0x0000000600000000| 0%| F| |TAMS 0x00000005ff800000| PB 0x00000005ff800000| Untracked | 0 +|1010|0x0000000600000000, 0x0000000600000000, 0x0000000600800000| 0%| F| |TAMS 0x0000000600000000| PB 0x0000000600000000| Untracked | 0 +|1011|0x0000000600800000, 0x0000000600800000, 0x0000000601000000| 0%| F| |TAMS 0x0000000600800000| PB 0x0000000600800000| Untracked | 0 +|1012|0x0000000601000000, 0x0000000601000000, 0x0000000601800000| 0%| F| |TAMS 0x0000000601000000| PB 0x0000000601000000| Untracked | 0 +|1013|0x0000000601800000, 0x0000000601800000, 0x0000000602000000| 0%| F| |TAMS 0x0000000601800000| PB 0x0000000601800000| Untracked | 0 +|1014|0x0000000602000000, 0x0000000602000000, 0x0000000602800000| 0%| F| |TAMS 0x0000000602000000| PB 0x0000000602000000| Untracked | 0 +|1015|0x0000000602800000, 0x0000000602800000, 0x0000000603000000| 0%| F| |TAMS 0x0000000602800000| PB 0x0000000602800000| Untracked | 0 +|1016|0x0000000603000000, 0x0000000603000000, 0x0000000603800000| 0%| F| |TAMS 0x0000000603000000| PB 0x0000000603000000| Untracked | 0 +|1017|0x0000000603800000, 0x0000000603800000, 0x0000000604000000| 0%| F| |TAMS 0x0000000603800000| PB 0x0000000603800000| Untracked | 0 +|1018|0x0000000604000000, 0x0000000604000000, 0x0000000604800000| 0%| F| |TAMS 0x0000000604000000| PB 0x0000000604000000| Untracked | 0 +|1019|0x0000000604800000, 0x0000000604800000, 0x0000000605000000| 0%| F| |TAMS 0x0000000604800000| PB 0x0000000604800000| Untracked | 0 +|1020|0x0000000605000000, 0x0000000605000000, 0x0000000605800000| 0%| F| |TAMS 0x0000000605000000| PB 0x0000000605000000| Untracked | 0 +|1021|0x0000000605800000, 0x0000000605800000, 0x0000000606000000| 0%| F| |TAMS 0x0000000605800000| PB 0x0000000605800000| Untracked | 0 +|1022|0x0000000606000000, 0x0000000606000000, 0x0000000606800000| 0%| F| |TAMS 0x0000000606000000| PB 0x0000000606000000| Untracked | 0 +|1023|0x0000000606800000, 0x0000000606800000, 0x0000000607000000| 0%| F| |TAMS 0x0000000606800000| PB 0x0000000606800000| Untracked | 0 +|1024|0x0000000607000000, 0x0000000607000000, 0x0000000607800000| 0%| F| |TAMS 0x0000000607000000| PB 0x0000000607000000| Untracked | 0 +|1025|0x0000000607800000, 0x0000000607800000, 0x0000000608000000| 0%| F| |TAMS 0x0000000607800000| PB 0x0000000607800000| Untracked | 0 +|1026|0x0000000608000000, 0x0000000608000000, 0x0000000608800000| 0%| F| |TAMS 0x0000000608000000| PB 0x0000000608000000| Untracked | 0 +|1027|0x0000000608800000, 0x0000000608800000, 0x0000000609000000| 0%| F| |TAMS 0x0000000608800000| PB 0x0000000608800000| Untracked | 0 +|1028|0x0000000609000000, 0x0000000609000000, 0x0000000609800000| 0%| F| |TAMS 0x0000000609000000| PB 0x0000000609000000| Untracked | 0 +|1029|0x0000000609800000, 0x0000000609800000, 0x000000060a000000| 0%| F| |TAMS 0x0000000609800000| PB 0x0000000609800000| Untracked | 0 +|1030|0x000000060a000000, 0x000000060a000000, 0x000000060a800000| 0%| F| |TAMS 0x000000060a000000| PB 0x000000060a000000| Untracked | 0 +|1031|0x000000060a800000, 0x000000060a800000, 0x000000060b000000| 0%| F| |TAMS 0x000000060a800000| PB 0x000000060a800000| Untracked | 0 +|1032|0x000000060b000000, 0x000000060b000000, 0x000000060b800000| 0%| F| |TAMS 0x000000060b000000| PB 0x000000060b000000| Untracked | 0 +|1033|0x000000060b800000, 0x000000060b800000, 0x000000060c000000| 0%| F| |TAMS 0x000000060b800000| PB 0x000000060b800000| Untracked | 0 +|1034|0x000000060c000000, 0x000000060c000000, 0x000000060c800000| 0%| F| |TAMS 0x000000060c000000| PB 0x000000060c000000| Untracked | 0 +|1035|0x000000060c800000, 0x000000060c800000, 0x000000060d000000| 0%| F| |TAMS 0x000000060c800000| PB 0x000000060c800000| Untracked | 0 +|1036|0x000000060d000000, 0x000000060d000000, 0x000000060d800000| 0%| F| |TAMS 0x000000060d000000| PB 0x000000060d000000| Untracked | 0 +|1037|0x000000060d800000, 0x000000060d800000, 0x000000060e000000| 0%| F| |TAMS 0x000000060d800000| PB 0x000000060d800000| Untracked | 0 +|1038|0x000000060e000000, 0x000000060e000000, 0x000000060e800000| 0%| F| |TAMS 0x000000060e000000| PB 0x000000060e000000| Untracked | 0 +|1039|0x000000060e800000, 0x000000060e800000, 0x000000060f000000| 0%| F| |TAMS 0x000000060e800000| PB 0x000000060e800000| Untracked | 0 +|1040|0x000000060f000000, 0x000000060f000000, 0x000000060f800000| 0%| F| |TAMS 0x000000060f000000| PB 0x000000060f000000| Untracked | 0 +|1041|0x000000060f800000, 0x000000060f800000, 0x0000000610000000| 0%| F| |TAMS 0x000000060f800000| PB 0x000000060f800000| Untracked | 0 +|1042|0x0000000610000000, 0x0000000610000000, 0x0000000610800000| 0%| F| |TAMS 0x0000000610000000| PB 0x0000000610000000| Untracked | 0 +|1043|0x0000000610800000, 0x0000000610800000, 0x0000000611000000| 0%| F| |TAMS 0x0000000610800000| PB 0x0000000610800000| Untracked | 0 +|1044|0x0000000611000000, 0x0000000611000000, 0x0000000611800000| 0%| F| |TAMS 0x0000000611000000| PB 0x0000000611000000| Untracked | 0 +|1045|0x0000000611800000, 0x0000000611800000, 0x0000000612000000| 0%| F| |TAMS 0x0000000611800000| PB 0x0000000611800000| Untracked | 0 +|1046|0x0000000612000000, 0x0000000612000000, 0x0000000612800000| 0%| F| |TAMS 0x0000000612000000| PB 0x0000000612000000| Untracked | 0 +|1047|0x0000000612800000, 0x0000000612800000, 0x0000000613000000| 0%| F| |TAMS 0x0000000612800000| PB 0x0000000612800000| Untracked | 0 +|1048|0x0000000613000000, 0x0000000613000000, 0x0000000613800000| 0%| F| |TAMS 0x0000000613000000| PB 0x0000000613000000| Untracked | 0 +|1049|0x0000000613800000, 0x0000000613800000, 0x0000000614000000| 0%| F| |TAMS 0x0000000613800000| PB 0x0000000613800000| Untracked | 0 +|1050|0x0000000614000000, 0x0000000614000000, 0x0000000614800000| 0%| F| |TAMS 0x0000000614000000| PB 0x0000000614000000| Untracked | 0 +|1051|0x0000000614800000, 0x0000000614800000, 0x0000000615000000| 0%| F| |TAMS 0x0000000614800000| PB 0x0000000614800000| Untracked | 0 +|1052|0x0000000615000000, 0x0000000615000000, 0x0000000615800000| 0%| F| |TAMS 0x0000000615000000| PB 0x0000000615000000| Untracked | 0 +|1053|0x0000000615800000, 0x0000000615800000, 0x0000000616000000| 0%| F| |TAMS 0x0000000615800000| PB 0x0000000615800000| Untracked | 0 +|1054|0x0000000616000000, 0x0000000616000000, 0x0000000616800000| 0%| F| |TAMS 0x0000000616000000| PB 0x0000000616000000| Untracked | 0 +|1055|0x0000000616800000, 0x0000000616800000, 0x0000000617000000| 0%| F| |TAMS 0x0000000616800000| PB 0x0000000616800000| Untracked | 0 +|1056|0x0000000617000000, 0x0000000617000000, 0x0000000617800000| 0%| F| |TAMS 0x0000000617000000| PB 0x0000000617000000| Untracked | 0 +|1057|0x0000000617800000, 0x0000000617800000, 0x0000000618000000| 0%| F| |TAMS 0x0000000617800000| PB 0x0000000617800000| Untracked | 0 +|1058|0x0000000618000000, 0x0000000618000000, 0x0000000618800000| 0%| F| |TAMS 0x0000000618000000| PB 0x0000000618000000| Untracked | 0 +|1059|0x0000000618800000, 0x0000000618800000, 0x0000000619000000| 0%| F| |TAMS 0x0000000618800000| PB 0x0000000618800000| Untracked | 0 +|1060|0x0000000619000000, 0x0000000619000000, 0x0000000619800000| 0%| F| |TAMS 0x0000000619000000| PB 0x0000000619000000| Untracked | 0 +|1061|0x0000000619800000, 0x0000000619800000, 0x000000061a000000| 0%| F| |TAMS 0x0000000619800000| PB 0x0000000619800000| Untracked | 0 +|1062|0x000000061a000000, 0x000000061a000000, 0x000000061a800000| 0%| F| |TAMS 0x000000061a000000| PB 0x000000061a000000| Untracked | 0 +|1063|0x000000061a800000, 0x000000061a800000, 0x000000061b000000| 0%| F| |TAMS 0x000000061a800000| PB 0x000000061a800000| Untracked | 0 +|1064|0x000000061b000000, 0x000000061b000000, 0x000000061b800000| 0%| F| |TAMS 0x000000061b000000| PB 0x000000061b000000| Untracked | 0 +|1065|0x000000061b800000, 0x000000061b800000, 0x000000061c000000| 0%| F| |TAMS 0x000000061b800000| PB 0x000000061b800000| Untracked | 0 +|1066|0x000000061c000000, 0x000000061c000000, 0x000000061c800000| 0%| F| |TAMS 0x000000061c000000| PB 0x000000061c000000| Untracked | 0 +|1067|0x000000061c800000, 0x000000061c800000, 0x000000061d000000| 0%| F| |TAMS 0x000000061c800000| PB 0x000000061c800000| Untracked | 0 +|1068|0x000000061d000000, 0x000000061d000000, 0x000000061d800000| 0%| F| |TAMS 0x000000061d000000| PB 0x000000061d000000| Untracked | 0 +|1069|0x000000061d800000, 0x000000061d800000, 0x000000061e000000| 0%| F| |TAMS 0x000000061d800000| PB 0x000000061d800000| Untracked | 0 +|1070|0x000000061e000000, 0x000000061e000000, 0x000000061e800000| 0%| F| |TAMS 0x000000061e000000| PB 0x000000061e000000| Untracked | 0 +|1071|0x000000061e800000, 0x000000061e800000, 0x000000061f000000| 0%| F| |TAMS 0x000000061e800000| PB 0x000000061e800000| Untracked | 0 +|1072|0x000000061f000000, 0x000000061f000000, 0x000000061f800000| 0%| F| |TAMS 0x000000061f000000| PB 0x000000061f000000| Untracked | 0 +|1073|0x000000061f800000, 0x000000061f800000, 0x0000000620000000| 0%| F| |TAMS 0x000000061f800000| PB 0x000000061f800000| Untracked | 0 +|1074|0x0000000620000000, 0x0000000620000000, 0x0000000620800000| 0%| F| |TAMS 0x0000000620000000| PB 0x0000000620000000| Untracked | 0 +|1075|0x0000000620800000, 0x0000000620800000, 0x0000000621000000| 0%| F| |TAMS 0x0000000620800000| PB 0x0000000620800000| Untracked | 0 +|1076|0x0000000621000000, 0x0000000621000000, 0x0000000621800000| 0%| F| |TAMS 0x0000000621000000| PB 0x0000000621000000| Untracked | 0 +|1077|0x0000000621800000, 0x0000000621800000, 0x0000000622000000| 0%| F| |TAMS 0x0000000621800000| PB 0x0000000621800000| Untracked | 0 +|1078|0x0000000622000000, 0x0000000622000000, 0x0000000622800000| 0%| F| |TAMS 0x0000000622000000| PB 0x0000000622000000| Untracked | 0 +|1079|0x0000000622800000, 0x0000000622800000, 0x0000000623000000| 0%| F| |TAMS 0x0000000622800000| PB 0x0000000622800000| Untracked | 0 +|1080|0x0000000623000000, 0x0000000623000000, 0x0000000623800000| 0%| F| |TAMS 0x0000000623000000| PB 0x0000000623000000| Untracked | 0 +|1081|0x0000000623800000, 0x0000000623800000, 0x0000000624000000| 0%| F| |TAMS 0x0000000623800000| PB 0x0000000623800000| Untracked | 0 +|1082|0x0000000624000000, 0x0000000624000000, 0x0000000624800000| 0%| F| |TAMS 0x0000000624000000| PB 0x0000000624000000| Untracked | 0 +|1083|0x0000000624800000, 0x0000000624800000, 0x0000000625000000| 0%| F| |TAMS 0x0000000624800000| PB 0x0000000624800000| Untracked | 0 +|1084|0x0000000625000000, 0x0000000625000000, 0x0000000625800000| 0%| F| |TAMS 0x0000000625000000| PB 0x0000000625000000| Untracked | 0 +|1085|0x0000000625800000, 0x0000000625800000, 0x0000000626000000| 0%| F| |TAMS 0x0000000625800000| PB 0x0000000625800000| Untracked | 0 +|1086|0x0000000626000000, 0x0000000626000000, 0x0000000626800000| 0%| F| |TAMS 0x0000000626000000| PB 0x0000000626000000| Untracked | 0 +|1087|0x0000000626800000, 0x0000000626800000, 0x0000000627000000| 0%| F| |TAMS 0x0000000626800000| PB 0x0000000626800000| Untracked | 0 +|1088|0x0000000627000000, 0x0000000627000000, 0x0000000627800000| 0%| F| |TAMS 0x0000000627000000| PB 0x0000000627000000| Untracked | 0 +|1089|0x0000000627800000, 0x0000000627800000, 0x0000000628000000| 0%| F| |TAMS 0x0000000627800000| PB 0x0000000627800000| Untracked | 0 +|1090|0x0000000628000000, 0x0000000628000000, 0x0000000628800000| 0%| F| |TAMS 0x0000000628000000| PB 0x0000000628000000| Untracked | 0 +|1091|0x0000000628800000, 0x0000000628800000, 0x0000000629000000| 0%| F| |TAMS 0x0000000628800000| PB 0x0000000628800000| Untracked | 0 +|1092|0x0000000629000000, 0x0000000629000000, 0x0000000629800000| 0%| F| |TAMS 0x0000000629000000| PB 0x0000000629000000| Untracked | 0 +|1093|0x0000000629800000, 0x0000000629800000, 0x000000062a000000| 0%| F| |TAMS 0x0000000629800000| PB 0x0000000629800000| Untracked | 0 +|1094|0x000000062a000000, 0x000000062a000000, 0x000000062a800000| 0%| F| |TAMS 0x000000062a000000| PB 0x000000062a000000| Untracked | 0 +|1095|0x000000062a800000, 0x000000062a800000, 0x000000062b000000| 0%| F| |TAMS 0x000000062a800000| PB 0x000000062a800000| Untracked | 0 +|1096|0x000000062b000000, 0x000000062b000000, 0x000000062b800000| 0%| F| |TAMS 0x000000062b000000| PB 0x000000062b000000| Untracked | 0 +|1097|0x000000062b800000, 0x000000062b800000, 0x000000062c000000| 0%| F| |TAMS 0x000000062b800000| PB 0x000000062b800000| Untracked | 0 +|1098|0x000000062c000000, 0x000000062c000000, 0x000000062c800000| 0%| F| |TAMS 0x000000062c000000| PB 0x000000062c000000| Untracked | 0 +|1099|0x000000062c800000, 0x000000062c800000, 0x000000062d000000| 0%| F| |TAMS 0x000000062c800000| PB 0x000000062c800000| Untracked | 0 +|1100|0x000000062d000000, 0x000000062d000000, 0x000000062d800000| 0%| F| |TAMS 0x000000062d000000| PB 0x000000062d000000| Untracked | 0 +|1101|0x000000062d800000, 0x000000062d800000, 0x000000062e000000| 0%| F| |TAMS 0x000000062d800000| PB 0x000000062d800000| Untracked | 0 +|1102|0x000000062e000000, 0x000000062e000000, 0x000000062e800000| 0%| F| |TAMS 0x000000062e000000| PB 0x000000062e000000| Untracked | 0 +|1103|0x000000062e800000, 0x000000062e800000, 0x000000062f000000| 0%| F| |TAMS 0x000000062e800000| PB 0x000000062e800000| Untracked | 0 +|1104|0x000000062f000000, 0x000000062f000000, 0x000000062f800000| 0%| F| |TAMS 0x000000062f000000| PB 0x000000062f000000| Untracked | 0 +|1105|0x000000062f800000, 0x000000062f800000, 0x0000000630000000| 0%| F| |TAMS 0x000000062f800000| PB 0x000000062f800000| Untracked | 0 +|1106|0x0000000630000000, 0x0000000630000000, 0x0000000630800000| 0%| F| |TAMS 0x0000000630000000| PB 0x0000000630000000| Untracked | 0 +|1107|0x0000000630800000, 0x0000000630800000, 0x0000000631000000| 0%| F| |TAMS 0x0000000630800000| PB 0x0000000630800000| Untracked | 0 +|1108|0x0000000631000000, 0x0000000631000000, 0x0000000631800000| 0%| F| |TAMS 0x0000000631000000| PB 0x0000000631000000| Untracked | 0 +|1109|0x0000000631800000, 0x0000000631800000, 0x0000000632000000| 0%| F| |TAMS 0x0000000631800000| PB 0x0000000631800000| Untracked | 0 +|1110|0x0000000632000000, 0x0000000632000000, 0x0000000632800000| 0%| F| |TAMS 0x0000000632000000| PB 0x0000000632000000| Untracked | 0 +|1111|0x0000000632800000, 0x0000000632800000, 0x0000000633000000| 0%| F| |TAMS 0x0000000632800000| PB 0x0000000632800000| Untracked | 0 +|1112|0x0000000633000000, 0x0000000633000000, 0x0000000633800000| 0%| F| |TAMS 0x0000000633000000| PB 0x0000000633000000| Untracked | 0 +|1113|0x0000000633800000, 0x0000000633800000, 0x0000000634000000| 0%| F| |TAMS 0x0000000633800000| PB 0x0000000633800000| Untracked | 0 +|1114|0x0000000634000000, 0x0000000634000000, 0x0000000634800000| 0%| F| |TAMS 0x0000000634000000| PB 0x0000000634000000| Untracked | 0 +|1115|0x0000000634800000, 0x0000000634800000, 0x0000000635000000| 0%| F| |TAMS 0x0000000634800000| PB 0x0000000634800000| Untracked | 0 +|1116|0x0000000635000000, 0x0000000635000000, 0x0000000635800000| 0%| F| |TAMS 0x0000000635000000| PB 0x0000000635000000| Untracked | 0 +|1117|0x0000000635800000, 0x0000000635800000, 0x0000000636000000| 0%| F| |TAMS 0x0000000635800000| PB 0x0000000635800000| Untracked | 0 +|1118|0x0000000636000000, 0x0000000636000000, 0x0000000636800000| 0%| F| |TAMS 0x0000000636000000| PB 0x0000000636000000| Untracked | 0 +|1119|0x0000000636800000, 0x0000000636800000, 0x0000000637000000| 0%| F| |TAMS 0x0000000636800000| PB 0x0000000636800000| Untracked | 0 +|1120|0x0000000637000000, 0x0000000637000000, 0x0000000637800000| 0%| F| |TAMS 0x0000000637000000| PB 0x0000000637000000| Untracked | 0 +|1121|0x0000000637800000, 0x0000000637800000, 0x0000000638000000| 0%| F| |TAMS 0x0000000637800000| PB 0x0000000637800000| Untracked | 0 +|1122|0x0000000638000000, 0x0000000638000000, 0x0000000638800000| 0%| F| |TAMS 0x0000000638000000| PB 0x0000000638000000| Untracked | 0 +|1123|0x0000000638800000, 0x0000000638800000, 0x0000000639000000| 0%| F| |TAMS 0x0000000638800000| PB 0x0000000638800000| Untracked | 0 +|1124|0x0000000639000000, 0x0000000639000000, 0x0000000639800000| 0%| F| |TAMS 0x0000000639000000| PB 0x0000000639000000| Untracked | 0 +|1125|0x0000000639800000, 0x0000000639800000, 0x000000063a000000| 0%| F| |TAMS 0x0000000639800000| PB 0x0000000639800000| Untracked | 0 +|1126|0x000000063a000000, 0x000000063a000000, 0x000000063a800000| 0%| F| |TAMS 0x000000063a000000| PB 0x000000063a000000| Untracked | 0 +|1127|0x000000063a800000, 0x000000063a800000, 0x000000063b000000| 0%| F| |TAMS 0x000000063a800000| PB 0x000000063a800000| Untracked | 0 +|1128|0x000000063b000000, 0x000000063b000000, 0x000000063b800000| 0%| F| |TAMS 0x000000063b000000| PB 0x000000063b000000| Untracked | 0 +|1129|0x000000063b800000, 0x000000063b800000, 0x000000063c000000| 0%| F| |TAMS 0x000000063b800000| PB 0x000000063b800000| Untracked | 0 +|1130|0x000000063c000000, 0x000000063c000000, 0x000000063c800000| 0%| F| |TAMS 0x000000063c000000| PB 0x000000063c000000| Untracked | 0 +|1131|0x000000063c800000, 0x000000063c800000, 0x000000063d000000| 0%| F| |TAMS 0x000000063c800000| PB 0x000000063c800000| Untracked | 0 +|1132|0x000000063d000000, 0x000000063d000000, 0x000000063d800000| 0%| F| |TAMS 0x000000063d000000| PB 0x000000063d000000| Untracked | 0 +|1133|0x000000063d800000, 0x000000063d800000, 0x000000063e000000| 0%| F| |TAMS 0x000000063d800000| PB 0x000000063d800000| Untracked | 0 +|1134|0x000000063e000000, 0x000000063e000000, 0x000000063e800000| 0%| F| |TAMS 0x000000063e000000| PB 0x000000063e000000| Untracked | 0 +|1135|0x000000063e800000, 0x000000063e800000, 0x000000063f000000| 0%| F| |TAMS 0x000000063e800000| PB 0x000000063e800000| Untracked | 0 +|1136|0x000000063f000000, 0x000000063f000000, 0x000000063f800000| 0%| F| |TAMS 0x000000063f000000| PB 0x000000063f000000| Untracked | 0 +|1137|0x000000063f800000, 0x000000063f800000, 0x0000000640000000| 0%| F| |TAMS 0x000000063f800000| PB 0x000000063f800000| Untracked | 0 +|1138|0x0000000640000000, 0x0000000640000000, 0x0000000640800000| 0%| F| |TAMS 0x0000000640000000| PB 0x0000000640000000| Untracked | 0 +|1139|0x0000000640800000, 0x0000000640800000, 0x0000000641000000| 0%| F| |TAMS 0x0000000640800000| PB 0x0000000640800000| Untracked | 0 +|1140|0x0000000641000000, 0x0000000641000000, 0x0000000641800000| 0%| F| |TAMS 0x0000000641000000| PB 0x0000000641000000| Untracked | 0 +|1141|0x0000000641800000, 0x0000000641800000, 0x0000000642000000| 0%| F| |TAMS 0x0000000641800000| PB 0x0000000641800000| Untracked | 0 +|1142|0x0000000642000000, 0x0000000642000000, 0x0000000642800000| 0%| F| |TAMS 0x0000000642000000| PB 0x0000000642000000| Untracked | 0 +|1143|0x0000000642800000, 0x0000000642800000, 0x0000000643000000| 0%| F| |TAMS 0x0000000642800000| PB 0x0000000642800000| Untracked | 0 +|1144|0x0000000643000000, 0x0000000643000000, 0x0000000643800000| 0%| F| |TAMS 0x0000000643000000| PB 0x0000000643000000| Untracked | 0 +|1145|0x0000000643800000, 0x0000000643800000, 0x0000000644000000| 0%| F| |TAMS 0x0000000643800000| PB 0x0000000643800000| Untracked | 0 +|1146|0x0000000644000000, 0x0000000644000000, 0x0000000644800000| 0%| F| |TAMS 0x0000000644000000| PB 0x0000000644000000| Untracked | 0 +|1147|0x0000000644800000, 0x0000000644800000, 0x0000000645000000| 0%| F| |TAMS 0x0000000644800000| PB 0x0000000644800000| Untracked | 0 +|1148|0x0000000645000000, 0x0000000645000000, 0x0000000645800000| 0%| F| |TAMS 0x0000000645000000| PB 0x0000000645000000| Untracked | 0 +|1149|0x0000000645800000, 0x0000000645800000, 0x0000000646000000| 0%| F| |TAMS 0x0000000645800000| PB 0x0000000645800000| Untracked | 0 +|1150|0x0000000646000000, 0x0000000646000000, 0x0000000646800000| 0%| F| |TAMS 0x0000000646000000| PB 0x0000000646000000| Untracked | 0 +|1151|0x0000000646800000, 0x0000000646800000, 0x0000000647000000| 0%| F| |TAMS 0x0000000646800000| PB 0x0000000646800000| Untracked | 0 +|1152|0x0000000647000000, 0x0000000647000000, 0x0000000647800000| 0%| F| |TAMS 0x0000000647000000| PB 0x0000000647000000| Untracked | 0 +|1153|0x0000000647800000, 0x0000000647800000, 0x0000000648000000| 0%| F| |TAMS 0x0000000647800000| PB 0x0000000647800000| Untracked | 0 +|1154|0x0000000648000000, 0x0000000648000000, 0x0000000648800000| 0%| F| |TAMS 0x0000000648000000| PB 0x0000000648000000| Untracked | 0 +|1155|0x0000000648800000, 0x0000000648800000, 0x0000000649000000| 0%| F| |TAMS 0x0000000648800000| PB 0x0000000648800000| Untracked | 0 +|1156|0x0000000649000000, 0x0000000649000000, 0x0000000649800000| 0%| F| |TAMS 0x0000000649000000| PB 0x0000000649000000| Untracked | 0 +|1157|0x0000000649800000, 0x0000000649800000, 0x000000064a000000| 0%| F| |TAMS 0x0000000649800000| PB 0x0000000649800000| Untracked | 0 +|1158|0x000000064a000000, 0x000000064a000000, 0x000000064a800000| 0%| F| |TAMS 0x000000064a000000| PB 0x000000064a000000| Untracked | 0 +|1159|0x000000064a800000, 0x000000064a800000, 0x000000064b000000| 0%| F| |TAMS 0x000000064a800000| PB 0x000000064a800000| Untracked | 0 +|1160|0x000000064b000000, 0x000000064b000000, 0x000000064b800000| 0%| F| |TAMS 0x000000064b000000| PB 0x000000064b000000| Untracked | 0 +|1161|0x000000064b800000, 0x000000064b800000, 0x000000064c000000| 0%| F| |TAMS 0x000000064b800000| PB 0x000000064b800000| Untracked | 0 +|1162|0x000000064c000000, 0x000000064c000000, 0x000000064c800000| 0%| F| |TAMS 0x000000064c000000| PB 0x000000064c000000| Untracked | 0 +|1163|0x000000064c800000, 0x000000064c800000, 0x000000064d000000| 0%| F| |TAMS 0x000000064c800000| PB 0x000000064c800000| Untracked | 0 +|1164|0x000000064d000000, 0x000000064d000000, 0x000000064d800000| 0%| F| |TAMS 0x000000064d000000| PB 0x000000064d000000| Untracked | 0 +|1165|0x000000064d800000, 0x000000064d800000, 0x000000064e000000| 0%| F| |TAMS 0x000000064d800000| PB 0x000000064d800000| Untracked | 0 +|1166|0x000000064e000000, 0x000000064e000000, 0x000000064e800000| 0%| F| |TAMS 0x000000064e000000| PB 0x000000064e000000| Untracked | 0 +|1167|0x000000064e800000, 0x000000064e800000, 0x000000064f000000| 0%| F| |TAMS 0x000000064e800000| PB 0x000000064e800000| Untracked | 0 +|1168|0x000000064f000000, 0x000000064f000000, 0x000000064f800000| 0%| F| |TAMS 0x000000064f000000| PB 0x000000064f000000| Untracked | 0 +|1169|0x000000064f800000, 0x000000064f800000, 0x0000000650000000| 0%| F| |TAMS 0x000000064f800000| PB 0x000000064f800000| Untracked | 0 +|1170|0x0000000650000000, 0x0000000650000000, 0x0000000650800000| 0%| F| |TAMS 0x0000000650000000| PB 0x0000000650000000| Untracked | 0 +|1171|0x0000000650800000, 0x0000000650800000, 0x0000000651000000| 0%| F| |TAMS 0x0000000650800000| PB 0x0000000650800000| Untracked | 0 +|1172|0x0000000651000000, 0x0000000651000000, 0x0000000651800000| 0%| F| |TAMS 0x0000000651000000| PB 0x0000000651000000| Untracked | 0 +|1173|0x0000000651800000, 0x0000000651800000, 0x0000000652000000| 0%| F| |TAMS 0x0000000651800000| PB 0x0000000651800000| Untracked | 0 +|1174|0x0000000652000000, 0x0000000652000000, 0x0000000652800000| 0%| F| |TAMS 0x0000000652000000| PB 0x0000000652000000| Untracked | 0 +|1175|0x0000000652800000, 0x0000000652800000, 0x0000000653000000| 0%| F| |TAMS 0x0000000652800000| PB 0x0000000652800000| Untracked | 0 +|1176|0x0000000653000000, 0x0000000653000000, 0x0000000653800000| 0%| F| |TAMS 0x0000000653000000| PB 0x0000000653000000| Untracked | 0 +|1177|0x0000000653800000, 0x0000000653800000, 0x0000000654000000| 0%| F| |TAMS 0x0000000653800000| PB 0x0000000653800000| Untracked | 0 +|1178|0x0000000654000000, 0x0000000654000000, 0x0000000654800000| 0%| F| |TAMS 0x0000000654000000| PB 0x0000000654000000| Untracked | 0 +|1179|0x0000000654800000, 0x0000000654800000, 0x0000000655000000| 0%| F| |TAMS 0x0000000654800000| PB 0x0000000654800000| Untracked | 0 +|1180|0x0000000655000000, 0x0000000655000000, 0x0000000655800000| 0%| F| |TAMS 0x0000000655000000| PB 0x0000000655000000| Untracked | 0 +|1181|0x0000000655800000, 0x0000000655800000, 0x0000000656000000| 0%| F| |TAMS 0x0000000655800000| PB 0x0000000655800000| Untracked | 0 +|1182|0x0000000656000000, 0x0000000656000000, 0x0000000656800000| 0%| F| |TAMS 0x0000000656000000| PB 0x0000000656000000| Untracked | 0 +|1183|0x0000000656800000, 0x0000000656800000, 0x0000000657000000| 0%| F| |TAMS 0x0000000656800000| PB 0x0000000656800000| Untracked | 0 +|1184|0x0000000657000000, 0x0000000657000000, 0x0000000657800000| 0%| F| |TAMS 0x0000000657000000| PB 0x0000000657000000| Untracked | 0 +|1185|0x0000000657800000, 0x0000000657800000, 0x0000000658000000| 0%| F| |TAMS 0x0000000657800000| PB 0x0000000657800000| Untracked | 0 +|1186|0x0000000658000000, 0x0000000658000000, 0x0000000658800000| 0%| F| |TAMS 0x0000000658000000| PB 0x0000000658000000| Untracked | 0 +|1187|0x0000000658800000, 0x0000000658800000, 0x0000000659000000| 0%| F| |TAMS 0x0000000658800000| PB 0x0000000658800000| Untracked | 0 +|1188|0x0000000659000000, 0x0000000659000000, 0x0000000659800000| 0%| F| |TAMS 0x0000000659000000| PB 0x0000000659000000| Untracked | 0 +|1189|0x0000000659800000, 0x0000000659800000, 0x000000065a000000| 0%| F| |TAMS 0x0000000659800000| PB 0x0000000659800000| Untracked | 0 +|1190|0x000000065a000000, 0x000000065a000000, 0x000000065a800000| 0%| F| |TAMS 0x000000065a000000| PB 0x000000065a000000| Untracked | 0 +|1191|0x000000065a800000, 0x000000065a800000, 0x000000065b000000| 0%| F| |TAMS 0x000000065a800000| PB 0x000000065a800000| Untracked | 0 +|1192|0x000000065b000000, 0x000000065b000000, 0x000000065b800000| 0%| F| |TAMS 0x000000065b000000| PB 0x000000065b000000| Untracked | 0 +|1193|0x000000065b800000, 0x000000065b800000, 0x000000065c000000| 0%| F| |TAMS 0x000000065b800000| PB 0x000000065b800000| Untracked | 0 +|1194|0x000000065c000000, 0x000000065c000000, 0x000000065c800000| 0%| F| |TAMS 0x000000065c000000| PB 0x000000065c000000| Untracked | 0 +|1195|0x000000065c800000, 0x000000065c800000, 0x000000065d000000| 0%| F| |TAMS 0x000000065c800000| PB 0x000000065c800000| Untracked | 0 +|1196|0x000000065d000000, 0x000000065d000000, 0x000000065d800000| 0%| F| |TAMS 0x000000065d000000| PB 0x000000065d000000| Untracked | 0 +|1197|0x000000065d800000, 0x000000065d800000, 0x000000065e000000| 0%| F| |TAMS 0x000000065d800000| PB 0x000000065d800000| Untracked | 0 +|1198|0x000000065e000000, 0x000000065e000000, 0x000000065e800000| 0%| F| |TAMS 0x000000065e000000| PB 0x000000065e000000| Untracked | 0 +|1199|0x000000065e800000, 0x000000065e800000, 0x000000065f000000| 0%| F| |TAMS 0x000000065e800000| PB 0x000000065e800000| Untracked | 0 +|1200|0x000000065f000000, 0x000000065f000000, 0x000000065f800000| 0%| F| |TAMS 0x000000065f000000| PB 0x000000065f000000| Untracked | 0 +|1201|0x000000065f800000, 0x000000065f800000, 0x0000000660000000| 0%| F| |TAMS 0x000000065f800000| PB 0x000000065f800000| Untracked | 0 +|1202|0x0000000660000000, 0x0000000660000000, 0x0000000660800000| 0%| F| |TAMS 0x0000000660000000| PB 0x0000000660000000| Untracked | 0 +|1203|0x0000000660800000, 0x0000000660800000, 0x0000000661000000| 0%| F| |TAMS 0x0000000660800000| PB 0x0000000660800000| Untracked | 0 +|1204|0x0000000661000000, 0x0000000661000000, 0x0000000661800000| 0%| F| |TAMS 0x0000000661000000| PB 0x0000000661000000| Untracked | 0 +|1205|0x0000000661800000, 0x0000000661800000, 0x0000000662000000| 0%| F| |TAMS 0x0000000661800000| PB 0x0000000661800000| Untracked | 0 +|1206|0x0000000662000000, 0x0000000662000000, 0x0000000662800000| 0%| F| |TAMS 0x0000000662000000| PB 0x0000000662000000| Untracked | 0 +|1207|0x0000000662800000, 0x0000000662800000, 0x0000000663000000| 0%| F| |TAMS 0x0000000662800000| PB 0x0000000662800000| Untracked | 0 +|1208|0x0000000663000000, 0x0000000663000000, 0x0000000663800000| 0%| F| |TAMS 0x0000000663000000| PB 0x0000000663000000| Untracked | 0 +|1209|0x0000000663800000, 0x0000000663800000, 0x0000000664000000| 0%| F| |TAMS 0x0000000663800000| PB 0x0000000663800000| Untracked | 0 +|1210|0x0000000664000000, 0x0000000664000000, 0x0000000664800000| 0%| F| |TAMS 0x0000000664000000| PB 0x0000000664000000| Untracked | 0 +|1211|0x0000000664800000, 0x0000000664800000, 0x0000000665000000| 0%| F| |TAMS 0x0000000664800000| PB 0x0000000664800000| Untracked | 0 +|1212|0x0000000665000000, 0x0000000665000000, 0x0000000665800000| 0%| F| |TAMS 0x0000000665000000| PB 0x0000000665000000| Untracked | 0 +|1213|0x0000000665800000, 0x0000000665800000, 0x0000000666000000| 0%| F| |TAMS 0x0000000665800000| PB 0x0000000665800000| Untracked | 0 +|1214|0x0000000666000000, 0x0000000666000000, 0x0000000666800000| 0%| F| |TAMS 0x0000000666000000| PB 0x0000000666000000| Untracked | 0 +|1215|0x0000000666800000, 0x0000000666800000, 0x0000000667000000| 0%| F| |TAMS 0x0000000666800000| PB 0x0000000666800000| Untracked | 0 +|1216|0x0000000667000000, 0x0000000667000000, 0x0000000667800000| 0%| F| |TAMS 0x0000000667000000| PB 0x0000000667000000| Untracked | 0 +|1217|0x0000000667800000, 0x0000000667800000, 0x0000000668000000| 0%| F| |TAMS 0x0000000667800000| PB 0x0000000667800000| Untracked | 0 +|1218|0x0000000668000000, 0x0000000668000000, 0x0000000668800000| 0%| F| |TAMS 0x0000000668000000| PB 0x0000000668000000| Untracked | 0 +|1219|0x0000000668800000, 0x0000000668800000, 0x0000000669000000| 0%| F| |TAMS 0x0000000668800000| PB 0x0000000668800000| Untracked | 0 +|1220|0x0000000669000000, 0x0000000669000000, 0x0000000669800000| 0%| F| |TAMS 0x0000000669000000| PB 0x0000000669000000| Untracked | 0 +|1221|0x0000000669800000, 0x0000000669800000, 0x000000066a000000| 0%| F| |TAMS 0x0000000669800000| PB 0x0000000669800000| Untracked | 0 +|1222|0x000000066a000000, 0x000000066a000000, 0x000000066a800000| 0%| F| |TAMS 0x000000066a000000| PB 0x000000066a000000| Untracked | 0 +|1223|0x000000066a800000, 0x000000066a800000, 0x000000066b000000| 0%| F| |TAMS 0x000000066a800000| PB 0x000000066a800000| Untracked | 0 +|1224|0x000000066b000000, 0x000000066b000000, 0x000000066b800000| 0%| F| |TAMS 0x000000066b000000| PB 0x000000066b000000| Untracked | 0 +|1225|0x000000066b800000, 0x000000066b800000, 0x000000066c000000| 0%| F| |TAMS 0x000000066b800000| PB 0x000000066b800000| Untracked | 0 +|1226|0x000000066c000000, 0x000000066c000000, 0x000000066c800000| 0%| F| |TAMS 0x000000066c000000| PB 0x000000066c000000| Untracked | 0 +|1227|0x000000066c800000, 0x000000066c800000, 0x000000066d000000| 0%| F| |TAMS 0x000000066c800000| PB 0x000000066c800000| Untracked | 0 +|1228|0x000000066d000000, 0x000000066d000000, 0x000000066d800000| 0%| F| |TAMS 0x000000066d000000| PB 0x000000066d000000| Untracked | 0 +|1229|0x000000066d800000, 0x000000066d800000, 0x000000066e000000| 0%| F| |TAMS 0x000000066d800000| PB 0x000000066d800000| Untracked | 0 +|1230|0x000000066e000000, 0x000000066e000000, 0x000000066e800000| 0%| F| |TAMS 0x000000066e000000| PB 0x000000066e000000| Untracked | 0 +|1231|0x000000066e800000, 0x000000066e800000, 0x000000066f000000| 0%| F| |TAMS 0x000000066e800000| PB 0x000000066e800000| Untracked | 0 +|1232|0x000000066f000000, 0x000000066f000000, 0x000000066f800000| 0%| F| |TAMS 0x000000066f000000| PB 0x000000066f000000| Untracked | 0 +|1233|0x000000066f800000, 0x000000066f800000, 0x0000000670000000| 0%| F| |TAMS 0x000000066f800000| PB 0x000000066f800000| Untracked | 0 +|1234|0x0000000670000000, 0x0000000670000000, 0x0000000670800000| 0%| F| |TAMS 0x0000000670000000| PB 0x0000000670000000| Untracked | 0 +|1235|0x0000000670800000, 0x0000000670800000, 0x0000000671000000| 0%| F| |TAMS 0x0000000670800000| PB 0x0000000670800000| Untracked | 0 +|1236|0x0000000671000000, 0x0000000671000000, 0x0000000671800000| 0%| F| |TAMS 0x0000000671000000| PB 0x0000000671000000| Untracked | 0 +|1237|0x0000000671800000, 0x0000000671800000, 0x0000000672000000| 0%| F| |TAMS 0x0000000671800000| PB 0x0000000671800000| Untracked | 0 +|1238|0x0000000672000000, 0x0000000672000000, 0x0000000672800000| 0%| F| |TAMS 0x0000000672000000| PB 0x0000000672000000| Untracked | 0 +|1239|0x0000000672800000, 0x0000000672800000, 0x0000000673000000| 0%| F| |TAMS 0x0000000672800000| PB 0x0000000672800000| Untracked | 0 +|1240|0x0000000673000000, 0x0000000673000000, 0x0000000673800000| 0%| F| |TAMS 0x0000000673000000| PB 0x0000000673000000| Untracked | 0 +|1241|0x0000000673800000, 0x0000000673800000, 0x0000000674000000| 0%| F| |TAMS 0x0000000673800000| PB 0x0000000673800000| Untracked | 0 +|1242|0x0000000674000000, 0x0000000674000000, 0x0000000674800000| 0%| F| |TAMS 0x0000000674000000| PB 0x0000000674000000| Untracked | 0 +|1243|0x0000000674800000, 0x0000000674800000, 0x0000000675000000| 0%| F| |TAMS 0x0000000674800000| PB 0x0000000674800000| Untracked | 0 +|1244|0x0000000675000000, 0x0000000675000000, 0x0000000675800000| 0%| F| |TAMS 0x0000000675000000| PB 0x0000000675000000| Untracked | 0 +|1245|0x0000000675800000, 0x0000000675800000, 0x0000000676000000| 0%| F| |TAMS 0x0000000675800000| PB 0x0000000675800000| Untracked | 0 +|1246|0x0000000676000000, 0x0000000676000000, 0x0000000676800000| 0%| F| |TAMS 0x0000000676000000| PB 0x0000000676000000| Untracked | 0 +|1247|0x0000000676800000, 0x0000000676800000, 0x0000000677000000| 0%| F| |TAMS 0x0000000676800000| PB 0x0000000676800000| Untracked | 0 +|1248|0x0000000677000000, 0x0000000677000000, 0x0000000677800000| 0%| F| |TAMS 0x0000000677000000| PB 0x0000000677000000| Untracked | 0 +|1249|0x0000000677800000, 0x0000000677800000, 0x0000000678000000| 0%| F| |TAMS 0x0000000677800000| PB 0x0000000677800000| Untracked | 0 +|1250|0x0000000678000000, 0x0000000678000000, 0x0000000678800000| 0%| F| |TAMS 0x0000000678000000| PB 0x0000000678000000| Untracked | 0 +|1251|0x0000000678800000, 0x0000000678800000, 0x0000000679000000| 0%| F| |TAMS 0x0000000678800000| PB 0x0000000678800000| Untracked | 0 +|1252|0x0000000679000000, 0x0000000679000000, 0x0000000679800000| 0%| F| |TAMS 0x0000000679000000| PB 0x0000000679000000| Untracked | 0 +|1253|0x0000000679800000, 0x0000000679800000, 0x000000067a000000| 0%| F| |TAMS 0x0000000679800000| PB 0x0000000679800000| Untracked | 0 +|1254|0x000000067a000000, 0x000000067a000000, 0x000000067a800000| 0%| F| |TAMS 0x000000067a000000| PB 0x000000067a000000| Untracked | 0 +|1255|0x000000067a800000, 0x000000067a800000, 0x000000067b000000| 0%| F| |TAMS 0x000000067a800000| PB 0x000000067a800000| Untracked | 0 +|1256|0x000000067b000000, 0x000000067b000000, 0x000000067b800000| 0%| F| |TAMS 0x000000067b000000| PB 0x000000067b000000| Untracked | 0 +|1257|0x000000067b800000, 0x000000067b800000, 0x000000067c000000| 0%| F| |TAMS 0x000000067b800000| PB 0x000000067b800000| Untracked | 0 +|1258|0x000000067c000000, 0x000000067c000000, 0x000000067c800000| 0%| F| |TAMS 0x000000067c000000| PB 0x000000067c000000| Untracked | 0 +|1259|0x000000067c800000, 0x000000067c800000, 0x000000067d000000| 0%| F| |TAMS 0x000000067c800000| PB 0x000000067c800000| Untracked | 0 +|1260|0x000000067d000000, 0x000000067d000000, 0x000000067d800000| 0%| F| |TAMS 0x000000067d000000| PB 0x000000067d000000| Untracked | 0 +|1261|0x000000067d800000, 0x000000067d800000, 0x000000067e000000| 0%| F| |TAMS 0x000000067d800000| PB 0x000000067d800000| Untracked | 0 +|1262|0x000000067e000000, 0x000000067e000000, 0x000000067e800000| 0%| F| |TAMS 0x000000067e000000| PB 0x000000067e000000| Untracked | 0 +|1263|0x000000067e800000, 0x000000067e800000, 0x000000067f000000| 0%| F| |TAMS 0x000000067e800000| PB 0x000000067e800000| Untracked | 0 +|1264|0x000000067f000000, 0x000000067f000000, 0x000000067f800000| 0%| F| |TAMS 0x000000067f000000| PB 0x000000067f000000| Untracked | 0 +|1265|0x000000067f800000, 0x000000067f800000, 0x0000000680000000| 0%| F| |TAMS 0x000000067f800000| PB 0x000000067f800000| Untracked | 0 +|1266|0x0000000680000000, 0x0000000680000000, 0x0000000680800000| 0%| F| |TAMS 0x0000000680000000| PB 0x0000000680000000| Untracked | 0 +|1267|0x0000000680800000, 0x0000000680800000, 0x0000000681000000| 0%| F| |TAMS 0x0000000680800000| PB 0x0000000680800000| Untracked | 0 +|1268|0x0000000681000000, 0x0000000681000000, 0x0000000681800000| 0%| F| |TAMS 0x0000000681000000| PB 0x0000000681000000| Untracked | 0 +|1269|0x0000000681800000, 0x0000000681800000, 0x0000000682000000| 0%| F| |TAMS 0x0000000681800000| PB 0x0000000681800000| Untracked | 0 +|1270|0x0000000682000000, 0x0000000682000000, 0x0000000682800000| 0%| F| |TAMS 0x0000000682000000| PB 0x0000000682000000| Untracked | 0 +|1271|0x0000000682800000, 0x0000000682800000, 0x0000000683000000| 0%| F| |TAMS 0x0000000682800000| PB 0x0000000682800000| Untracked | 0 +|1272|0x0000000683000000, 0x0000000683000000, 0x0000000683800000| 0%| F| |TAMS 0x0000000683000000| PB 0x0000000683000000| Untracked | 0 +|1273|0x0000000683800000, 0x0000000683800000, 0x0000000684000000| 0%| F| |TAMS 0x0000000683800000| PB 0x0000000683800000| Untracked | 0 +|1274|0x0000000684000000, 0x0000000684000000, 0x0000000684800000| 0%| F| |TAMS 0x0000000684000000| PB 0x0000000684000000| Untracked | 0 +|1275|0x0000000684800000, 0x0000000684800000, 0x0000000685000000| 0%| F| |TAMS 0x0000000684800000| PB 0x0000000684800000| Untracked | 0 +|1276|0x0000000685000000, 0x0000000685000000, 0x0000000685800000| 0%| F| |TAMS 0x0000000685000000| PB 0x0000000685000000| Untracked | 0 +|1277|0x0000000685800000, 0x0000000685800000, 0x0000000686000000| 0%| F| |TAMS 0x0000000685800000| PB 0x0000000685800000| Untracked | 0 +|1278|0x0000000686000000, 0x0000000686000000, 0x0000000686800000| 0%| F| |TAMS 0x0000000686000000| PB 0x0000000686000000| Untracked | 0 +|1279|0x0000000686800000, 0x0000000686800000, 0x0000000687000000| 0%| F| |TAMS 0x0000000686800000| PB 0x0000000686800000| Untracked | 0 +|1280|0x0000000687000000, 0x0000000687000000, 0x0000000687800000| 0%| F| |TAMS 0x0000000687000000| PB 0x0000000687000000| Untracked | 0 +|1281|0x0000000687800000, 0x0000000687800000, 0x0000000688000000| 0%| F| |TAMS 0x0000000687800000| PB 0x0000000687800000| Untracked | 0 +|1282|0x0000000688000000, 0x0000000688000000, 0x0000000688800000| 0%| F| |TAMS 0x0000000688000000| PB 0x0000000688000000| Untracked | 0 +|1283|0x0000000688800000, 0x0000000688800000, 0x0000000689000000| 0%| F| |TAMS 0x0000000688800000| PB 0x0000000688800000| Untracked | 0 +|1284|0x0000000689000000, 0x0000000689000000, 0x0000000689800000| 0%| F| |TAMS 0x0000000689000000| PB 0x0000000689000000| Untracked | 0 +|1285|0x0000000689800000, 0x0000000689800000, 0x000000068a000000| 0%| F| |TAMS 0x0000000689800000| PB 0x0000000689800000| Untracked | 0 +|1286|0x000000068a000000, 0x000000068a000000, 0x000000068a800000| 0%| F| |TAMS 0x000000068a000000| PB 0x000000068a000000| Untracked | 0 +|1287|0x000000068a800000, 0x000000068a800000, 0x000000068b000000| 0%| F| |TAMS 0x000000068a800000| PB 0x000000068a800000| Untracked | 0 +|1288|0x000000068b000000, 0x000000068b000000, 0x000000068b800000| 0%| F| |TAMS 0x000000068b000000| PB 0x000000068b000000| Untracked | 0 +|1289|0x000000068b800000, 0x000000068b800000, 0x000000068c000000| 0%| F| |TAMS 0x000000068b800000| PB 0x000000068b800000| Untracked | 0 +|1290|0x000000068c000000, 0x000000068c000000, 0x000000068c800000| 0%| F| |TAMS 0x000000068c000000| PB 0x000000068c000000| Untracked | 0 +|1291|0x000000068c800000, 0x000000068c800000, 0x000000068d000000| 0%| F| |TAMS 0x000000068c800000| PB 0x000000068c800000| Untracked | 0 +|1292|0x000000068d000000, 0x000000068d000000, 0x000000068d800000| 0%| F| |TAMS 0x000000068d000000| PB 0x000000068d000000| Untracked | 0 +|1293|0x000000068d800000, 0x000000068d800000, 0x000000068e000000| 0%| F| |TAMS 0x000000068d800000| PB 0x000000068d800000| Untracked | 0 +|1294|0x000000068e000000, 0x000000068e000000, 0x000000068e800000| 0%| F| |TAMS 0x000000068e000000| PB 0x000000068e000000| Untracked | 0 +|1295|0x000000068e800000, 0x000000068e800000, 0x000000068f000000| 0%| F| |TAMS 0x000000068e800000| PB 0x000000068e800000| Untracked | 0 +|1296|0x000000068f000000, 0x000000068f000000, 0x000000068f800000| 0%| F| |TAMS 0x000000068f000000| PB 0x000000068f000000| Untracked | 0 +|1297|0x000000068f800000, 0x000000068f800000, 0x0000000690000000| 0%| F| |TAMS 0x000000068f800000| PB 0x000000068f800000| Untracked | 0 +|1298|0x0000000690000000, 0x0000000690000000, 0x0000000690800000| 0%| F| |TAMS 0x0000000690000000| PB 0x0000000690000000| Untracked | 0 +|1299|0x0000000690800000, 0x0000000690800000, 0x0000000691000000| 0%| F| |TAMS 0x0000000690800000| PB 0x0000000690800000| Untracked | 0 +|1300|0x0000000691000000, 0x0000000691000000, 0x0000000691800000| 0%| F| |TAMS 0x0000000691000000| PB 0x0000000691000000| Untracked | 0 +|1301|0x0000000691800000, 0x0000000691800000, 0x0000000692000000| 0%| F| |TAMS 0x0000000691800000| PB 0x0000000691800000| Untracked | 0 +|1302|0x0000000692000000, 0x0000000692000000, 0x0000000692800000| 0%| F| |TAMS 0x0000000692000000| PB 0x0000000692000000| Untracked | 0 +|1303|0x0000000692800000, 0x0000000692800000, 0x0000000693000000| 0%| F| |TAMS 0x0000000692800000| PB 0x0000000692800000| Untracked | 0 +|1304|0x0000000693000000, 0x0000000693000000, 0x0000000693800000| 0%| F| |TAMS 0x0000000693000000| PB 0x0000000693000000| Untracked | 0 +|1305|0x0000000693800000, 0x0000000693800000, 0x0000000694000000| 0%| F| |TAMS 0x0000000693800000| PB 0x0000000693800000| Untracked | 0 +|1306|0x0000000694000000, 0x0000000694000000, 0x0000000694800000| 0%| F| |TAMS 0x0000000694000000| PB 0x0000000694000000| Untracked | 0 +|1307|0x0000000694800000, 0x0000000694800000, 0x0000000695000000| 0%| F| |TAMS 0x0000000694800000| PB 0x0000000694800000| Untracked | 0 +|1308|0x0000000695000000, 0x0000000695000000, 0x0000000695800000| 0%| F| |TAMS 0x0000000695000000| PB 0x0000000695000000| Untracked | 0 +|1309|0x0000000695800000, 0x0000000695800000, 0x0000000696000000| 0%| F| |TAMS 0x0000000695800000| PB 0x0000000695800000| Untracked | 0 +|1310|0x0000000696000000, 0x0000000696000000, 0x0000000696800000| 0%| F| |TAMS 0x0000000696000000| PB 0x0000000696000000| Untracked | 0 +|1311|0x0000000696800000, 0x0000000696800000, 0x0000000697000000| 0%| F| |TAMS 0x0000000696800000| PB 0x0000000696800000| Untracked | 0 +|1312|0x0000000697000000, 0x0000000697000000, 0x0000000697800000| 0%| F| |TAMS 0x0000000697000000| PB 0x0000000697000000| Untracked | 0 +|1313|0x0000000697800000, 0x0000000697800000, 0x0000000698000000| 0%| F| |TAMS 0x0000000697800000| PB 0x0000000697800000| Untracked | 0 +|1314|0x0000000698000000, 0x0000000698000000, 0x0000000698800000| 0%| F| |TAMS 0x0000000698000000| PB 0x0000000698000000| Untracked | 0 +|1315|0x0000000698800000, 0x0000000698800000, 0x0000000699000000| 0%| F| |TAMS 0x0000000698800000| PB 0x0000000698800000| Untracked | 0 +|1316|0x0000000699000000, 0x0000000699000000, 0x0000000699800000| 0%| F| |TAMS 0x0000000699000000| PB 0x0000000699000000| Untracked | 0 +|1317|0x0000000699800000, 0x0000000699800000, 0x000000069a000000| 0%| F| |TAMS 0x0000000699800000| PB 0x0000000699800000| Untracked | 0 +|1318|0x000000069a000000, 0x000000069a000000, 0x000000069a800000| 0%| F| |TAMS 0x000000069a000000| PB 0x000000069a000000| Untracked | 0 +|1319|0x000000069a800000, 0x000000069a800000, 0x000000069b000000| 0%| F| |TAMS 0x000000069a800000| PB 0x000000069a800000| Untracked | 0 +|1320|0x000000069b000000, 0x000000069b000000, 0x000000069b800000| 0%| F| |TAMS 0x000000069b000000| PB 0x000000069b000000| Untracked | 0 +|1321|0x000000069b800000, 0x000000069b800000, 0x000000069c000000| 0%| F| |TAMS 0x000000069b800000| PB 0x000000069b800000| Untracked | 0 +|1322|0x000000069c000000, 0x000000069c000000, 0x000000069c800000| 0%| F| |TAMS 0x000000069c000000| PB 0x000000069c000000| Untracked | 0 +|1323|0x000000069c800000, 0x000000069c800000, 0x000000069d000000| 0%| F| |TAMS 0x000000069c800000| PB 0x000000069c800000| Untracked | 0 +|1324|0x000000069d000000, 0x000000069d000000, 0x000000069d800000| 0%| F| |TAMS 0x000000069d000000| PB 0x000000069d000000| Untracked | 0 +|1325|0x000000069d800000, 0x000000069d800000, 0x000000069e000000| 0%| F| |TAMS 0x000000069d800000| PB 0x000000069d800000| Untracked | 0 +|1326|0x000000069e000000, 0x000000069e000000, 0x000000069e800000| 0%| F| |TAMS 0x000000069e000000| PB 0x000000069e000000| Untracked | 0 +|1327|0x000000069e800000, 0x000000069e800000, 0x000000069f000000| 0%| F| |TAMS 0x000000069e800000| PB 0x000000069e800000| Untracked | 0 +|1328|0x000000069f000000, 0x000000069f000000, 0x000000069f800000| 0%| F| |TAMS 0x000000069f000000| PB 0x000000069f000000| Untracked | 0 +|1329|0x000000069f800000, 0x000000069f800000, 0x00000006a0000000| 0%| F| |TAMS 0x000000069f800000| PB 0x000000069f800000| Untracked | 0 +|1330|0x00000006a0000000, 0x00000006a0000000, 0x00000006a0800000| 0%| F| |TAMS 0x00000006a0000000| PB 0x00000006a0000000| Untracked | 0 +|1331|0x00000006a0800000, 0x00000006a0800000, 0x00000006a1000000| 0%| F| |TAMS 0x00000006a0800000| PB 0x00000006a0800000| Untracked | 0 +|1332|0x00000006a1000000, 0x00000006a1000000, 0x00000006a1800000| 0%| F| |TAMS 0x00000006a1000000| PB 0x00000006a1000000| Untracked | 0 +|1333|0x00000006a1800000, 0x00000006a1800000, 0x00000006a2000000| 0%| F| |TAMS 0x00000006a1800000| PB 0x00000006a1800000| Untracked | 0 +|1334|0x00000006a2000000, 0x00000006a2000000, 0x00000006a2800000| 0%| F| |TAMS 0x00000006a2000000| PB 0x00000006a2000000| Untracked | 0 +|1335|0x00000006a2800000, 0x00000006a2800000, 0x00000006a3000000| 0%| F| |TAMS 0x00000006a2800000| PB 0x00000006a2800000| Untracked | 0 +|1336|0x00000006a3000000, 0x00000006a3000000, 0x00000006a3800000| 0%| F| |TAMS 0x00000006a3000000| PB 0x00000006a3000000| Untracked | 0 +|1337|0x00000006a3800000, 0x00000006a3800000, 0x00000006a4000000| 0%| F| |TAMS 0x00000006a3800000| PB 0x00000006a3800000| Untracked | 0 +|1338|0x00000006a4000000, 0x00000006a4000000, 0x00000006a4800000| 0%| F| |TAMS 0x00000006a4000000| PB 0x00000006a4000000| Untracked | 0 +|1339|0x00000006a4800000, 0x00000006a4800000, 0x00000006a5000000| 0%| F| |TAMS 0x00000006a4800000| PB 0x00000006a4800000| Untracked | 0 +|1340|0x00000006a5000000, 0x00000006a5000000, 0x00000006a5800000| 0%| F| |TAMS 0x00000006a5000000| PB 0x00000006a5000000| Untracked | 0 +|1341|0x00000006a5800000, 0x00000006a5800000, 0x00000006a6000000| 0%| F| |TAMS 0x00000006a5800000| PB 0x00000006a5800000| Untracked | 0 +|1342|0x00000006a6000000, 0x00000006a6000000, 0x00000006a6800000| 0%| F| |TAMS 0x00000006a6000000| PB 0x00000006a6000000| Untracked | 0 +|1343|0x00000006a6800000, 0x00000006a6800000, 0x00000006a7000000| 0%| F| |TAMS 0x00000006a6800000| PB 0x00000006a6800000| Untracked | 0 +|1344|0x00000006a7000000, 0x00000006a7000000, 0x00000006a7800000| 0%| F| |TAMS 0x00000006a7000000| PB 0x00000006a7000000| Untracked | 0 +|1345|0x00000006a7800000, 0x00000006a7800000, 0x00000006a8000000| 0%| F| |TAMS 0x00000006a7800000| PB 0x00000006a7800000| Untracked | 0 +|1346|0x00000006a8000000, 0x00000006a8000000, 0x00000006a8800000| 0%| F| |TAMS 0x00000006a8000000| PB 0x00000006a8000000| Untracked | 0 +|1347|0x00000006a8800000, 0x00000006a8800000, 0x00000006a9000000| 0%| F| |TAMS 0x00000006a8800000| PB 0x00000006a8800000| Untracked | 0 +|1348|0x00000006a9000000, 0x00000006a9000000, 0x00000006a9800000| 0%| F| |TAMS 0x00000006a9000000| PB 0x00000006a9000000| Untracked | 0 +|1349|0x00000006a9800000, 0x00000006a9800000, 0x00000006aa000000| 0%| F| |TAMS 0x00000006a9800000| PB 0x00000006a9800000| Untracked | 0 +|1350|0x00000006aa000000, 0x00000006aa000000, 0x00000006aa800000| 0%| F| |TAMS 0x00000006aa000000| PB 0x00000006aa000000| Untracked | 0 +|1351|0x00000006aa800000, 0x00000006aa800000, 0x00000006ab000000| 0%| F| |TAMS 0x00000006aa800000| PB 0x00000006aa800000| Untracked | 0 +|1352|0x00000006ab000000, 0x00000006ab000000, 0x00000006ab800000| 0%| F| |TAMS 0x00000006ab000000| PB 0x00000006ab000000| Untracked | 0 +|1353|0x00000006ab800000, 0x00000006ab800000, 0x00000006ac000000| 0%| F| |TAMS 0x00000006ab800000| PB 0x00000006ab800000| Untracked | 0 +|1354|0x00000006ac000000, 0x00000006ac000000, 0x00000006ac800000| 0%| F| |TAMS 0x00000006ac000000| PB 0x00000006ac000000| Untracked | 0 +|1355|0x00000006ac800000, 0x00000006ac800000, 0x00000006ad000000| 0%| F| |TAMS 0x00000006ac800000| PB 0x00000006ac800000| Untracked | 0 +|1356|0x00000006ad000000, 0x00000006ad000000, 0x00000006ad800000| 0%| F| |TAMS 0x00000006ad000000| PB 0x00000006ad000000| Untracked | 0 +|1357|0x00000006ad800000, 0x00000006ad800000, 0x00000006ae000000| 0%| F| |TAMS 0x00000006ad800000| PB 0x00000006ad800000| Untracked | 0 +|1358|0x00000006ae000000, 0x00000006ae000000, 0x00000006ae800000| 0%| F| |TAMS 0x00000006ae000000| PB 0x00000006ae000000| Untracked | 0 +|1359|0x00000006ae800000, 0x00000006ae800000, 0x00000006af000000| 0%| F| |TAMS 0x00000006ae800000| PB 0x00000006ae800000| Untracked | 0 +|1360|0x00000006af000000, 0x00000006af000000, 0x00000006af800000| 0%| F| |TAMS 0x00000006af000000| PB 0x00000006af000000| Untracked | 0 +|1361|0x00000006af800000, 0x00000006af800000, 0x00000006b0000000| 0%| F| |TAMS 0x00000006af800000| PB 0x00000006af800000| Untracked | 0 +|1362|0x00000006b0000000, 0x00000006b0000000, 0x00000006b0800000| 0%| F| |TAMS 0x00000006b0000000| PB 0x00000006b0000000| Untracked | 0 +|1363|0x00000006b0800000, 0x00000006b0800000, 0x00000006b1000000| 0%| F| |TAMS 0x00000006b0800000| PB 0x00000006b0800000| Untracked | 0 +|1364|0x00000006b1000000, 0x00000006b1000000, 0x00000006b1800000| 0%| F| |TAMS 0x00000006b1000000| PB 0x00000006b1000000| Untracked | 0 +|1365|0x00000006b1800000, 0x00000006b1800000, 0x00000006b2000000| 0%| F| |TAMS 0x00000006b1800000| PB 0x00000006b1800000| Untracked | 0 +|1366|0x00000006b2000000, 0x00000006b2000000, 0x00000006b2800000| 0%| F| |TAMS 0x00000006b2000000| PB 0x00000006b2000000| Untracked | 0 +|1367|0x00000006b2800000, 0x00000006b2800000, 0x00000006b3000000| 0%| F| |TAMS 0x00000006b2800000| PB 0x00000006b2800000| Untracked | 0 +|1368|0x00000006b3000000, 0x00000006b3000000, 0x00000006b3800000| 0%| F| |TAMS 0x00000006b3000000| PB 0x00000006b3000000| Untracked | 0 +|1369|0x00000006b3800000, 0x00000006b3800000, 0x00000006b4000000| 0%| F| |TAMS 0x00000006b3800000| PB 0x00000006b3800000| Untracked | 0 +|1370|0x00000006b4000000, 0x00000006b4000000, 0x00000006b4800000| 0%| F| |TAMS 0x00000006b4000000| PB 0x00000006b4000000| Untracked | 0 +|1371|0x00000006b4800000, 0x00000006b4800000, 0x00000006b5000000| 0%| F| |TAMS 0x00000006b4800000| PB 0x00000006b4800000| Untracked | 0 +|1372|0x00000006b5000000, 0x00000006b5000000, 0x00000006b5800000| 0%| F| |TAMS 0x00000006b5000000| PB 0x00000006b5000000| Untracked | 0 +|1373|0x00000006b5800000, 0x00000006b6000000, 0x00000006b6000000|100%| O| |TAMS 0x00000006b5800000| PB 0x00000006b5800000| Untracked | 0 +|1374|0x00000006b6000000, 0x00000006b6000000, 0x00000006b6800000| 0%| F| |TAMS 0x00000006b6000000| PB 0x00000006b6000000| Untracked | 0 +|1375|0x00000006b6800000, 0x00000006b7000000, 0x00000006b7000000|100%| O| |TAMS 0x00000006b6800000| PB 0x00000006b6800000| Untracked | 0 +|1376|0x00000006b7000000, 0x00000006b7800000, 0x00000006b7800000|100%| O| |TAMS 0x00000006b7000000| PB 0x00000006b7000000| Untracked | 0 +|1377|0x00000006b7800000, 0x00000006b7800000, 0x00000006b8000000| 0%| F| |TAMS 0x00000006b7800000| PB 0x00000006b7800000| Untracked | 0 +|1378|0x00000006b8000000, 0x00000006b8000000, 0x00000006b8800000| 0%| F| |TAMS 0x00000006b8000000| PB 0x00000006b8000000| Untracked | 0 +|1379|0x00000006b8800000, 0x00000006b8800000, 0x00000006b9000000| 0%| F| |TAMS 0x00000006b8800000| PB 0x00000006b8800000| Untracked | 0 +|1380|0x00000006b9000000, 0x00000006b9800000, 0x00000006b9800000|100%| O| |TAMS 0x00000006b9000000| PB 0x00000006b9000000| Untracked | 0 +|1381|0x00000006b9800000, 0x00000006b9800000, 0x00000006ba000000| 0%| F| |TAMS 0x00000006b9800000| PB 0x00000006b9800000| Untracked | 0 +|1382|0x00000006ba000000, 0x00000006ba000000, 0x00000006ba800000| 0%| F| |TAMS 0x00000006ba000000| PB 0x00000006ba000000| Untracked | 0 +|1383|0x00000006ba800000, 0x00000006bb000000, 0x00000006bb000000|100%| O| |TAMS 0x00000006ba800000| PB 0x00000006ba800000| Untracked | 0 +|1384|0x00000006bb000000, 0x00000006bb800000, 0x00000006bb800000|100%| O| |TAMS 0x00000006bb000000| PB 0x00000006bb000000| Untracked | 0 +|1385|0x00000006bb800000, 0x00000006bb800000, 0x00000006bc000000| 0%| F| |TAMS 0x00000006bb800000| PB 0x00000006bb800000| Untracked | 0 +|1386|0x00000006bc000000, 0x00000006bc800000, 0x00000006bc800000|100%| O| |TAMS 0x00000006bc000000| PB 0x00000006bc000000| Untracked | 0 +|1387|0x00000006bc800000, 0x00000006bc800000, 0x00000006bd000000| 0%| F| |TAMS 0x00000006bc800000| PB 0x00000006bc800000| Untracked | 0 +|1388|0x00000006bd000000, 0x00000006bd000000, 0x00000006bd800000| 0%| F| |TAMS 0x00000006bd000000| PB 0x00000006bd000000| Untracked | 0 +|1389|0x00000006bd800000, 0x00000006bd800000, 0x00000006be000000| 0%| F| |TAMS 0x00000006bd800000| PB 0x00000006bd800000| Untracked | 0 +|1390|0x00000006be000000, 0x00000006be000000, 0x00000006be800000| 0%| F| |TAMS 0x00000006be000000| PB 0x00000006be000000| Untracked | 0 +|1391|0x00000006be800000, 0x00000006be800000, 0x00000006bf000000| 0%| F| |TAMS 0x00000006be800000| PB 0x00000006be800000| Untracked | 0 +|1392|0x00000006bf000000, 0x00000006bf000000, 0x00000006bf800000| 0%| F| |TAMS 0x00000006bf000000| PB 0x00000006bf000000| Untracked | 0 +|1393|0x00000006bf800000, 0x00000006c0000000, 0x00000006c0000000|100%| O| |TAMS 0x00000006bf800000| PB 0x00000006bf800000| Untracked | 0 +|1394|0x00000006c0000000, 0x00000006c0000000, 0x00000006c0800000| 0%| F| |TAMS 0x00000006c0000000| PB 0x00000006c0000000| Untracked | 0 +|1395|0x00000006c0800000, 0x00000006c1000000, 0x00000006c1000000|100%| O| |TAMS 0x00000006c0800000| PB 0x00000006c0800000| Untracked | 0 +|1396|0x00000006c1000000, 0x00000006c1000000, 0x00000006c1800000| 0%| F| |TAMS 0x00000006c1000000| PB 0x00000006c1000000| Untracked | 0 +|1397|0x00000006c1800000, 0x00000006c2000000, 0x00000006c2000000|100%| O| |TAMS 0x00000006c1800000| PB 0x00000006c1800000| Untracked | 0 +|1398|0x00000006c2000000, 0x00000006c2800000, 0x00000006c2800000|100%| O| |TAMS 0x00000006c2000000| PB 0x00000006c2000000| Untracked | 0 +|1399|0x00000006c2800000, 0x00000006c3000000, 0x00000006c3000000|100%| O| |TAMS 0x00000006c2800000| PB 0x00000006c2800000| Untracked | 0 +|1400|0x00000006c3000000, 0x00000006c3800000, 0x00000006c3800000|100%| O| |TAMS 0x00000006c3000000| PB 0x00000006c3000000| Untracked | 0 +|1401|0x00000006c3800000, 0x00000006c4000000, 0x00000006c4000000|100%| O| |TAMS 0x00000006c3800000| PB 0x00000006c3800000| Untracked | 0 +|1402|0x00000006c4000000, 0x00000006c4800000, 0x00000006c4800000|100%| O| |TAMS 0x00000006c4000000| PB 0x00000006c4000000| Untracked | 0 +|1403|0x00000006c4800000, 0x00000006c5000000, 0x00000006c5000000|100%| O| |TAMS 0x00000006c4800000| PB 0x00000006c4800000| Untracked | 0 +|1404|0x00000006c5000000, 0x00000006c5800000, 0x00000006c5800000|100%| O| |TAMS 0x00000006c5000000| PB 0x00000006c5000000| Untracked | 0 +|1405|0x00000006c5800000, 0x00000006c6000000, 0x00000006c6000000|100%| O| |TAMS 0x00000006c5800000| PB 0x00000006c5800000| Untracked | 0 +|1406|0x00000006c6000000, 0x00000006c6800000, 0x00000006c6800000|100%| O| |TAMS 0x00000006c6000000| PB 0x00000006c6000000| Untracked | 0 +|1407|0x00000006c6800000, 0x00000006c7000000, 0x00000006c7000000|100%| O| |TAMS 0x00000006c6800000| PB 0x00000006c6800000| Untracked | 0 +|1408|0x00000006c7000000, 0x00000006c7800000, 0x00000006c7800000|100%| O| |TAMS 0x00000006c7000000| PB 0x00000006c7000000| Untracked | 0 +|1409|0x00000006c7800000, 0x00000006c8000000, 0x00000006c8000000|100%| O| |TAMS 0x00000006c7800000| PB 0x00000006c7800000| Untracked | 0 +|1410|0x00000006c8000000, 0x00000006c8800000, 0x00000006c8800000|100%| O| |TAMS 0x00000006c8000000| PB 0x00000006c8000000| Untracked | 0 +|1411|0x00000006c8800000, 0x00000006c9000000, 0x00000006c9000000|100%| O| |TAMS 0x00000006c8800000| PB 0x00000006c8800000| Untracked | 0 +|1412|0x00000006c9000000, 0x00000006c9800000, 0x00000006c9800000|100%| O| |TAMS 0x00000006c9000000| PB 0x00000006c9000000| Untracked | 0 +|1413|0x00000006c9800000, 0x00000006ca000000, 0x00000006ca000000|100%| O| |TAMS 0x00000006c9800000| PB 0x00000006c9800000| Untracked | 0 +|1414|0x00000006ca000000, 0x00000006ca800000, 0x00000006ca800000|100%| O| |TAMS 0x00000006ca000000| PB 0x00000006ca000000| Untracked | 0 +|1415|0x00000006ca800000, 0x00000006cb000000, 0x00000006cb000000|100%| O| |TAMS 0x00000006ca800000| PB 0x00000006ca800000| Untracked | 0 +|1416|0x00000006cb000000, 0x00000006cb800000, 0x00000006cb800000|100%| O| |TAMS 0x00000006cb000000| PB 0x00000006cb000000| Untracked | 0 +|1417|0x00000006cb800000, 0x00000006cc000000, 0x00000006cc000000|100%| O| |TAMS 0x00000006cb800000| PB 0x00000006cb800000| Untracked | 0 +|1418|0x00000006cc000000, 0x00000006cc800000, 0x00000006cc800000|100%| O| |TAMS 0x00000006cc000000| PB 0x00000006cc000000| Untracked | 0 +|1419|0x00000006cc800000, 0x00000006cd000000, 0x00000006cd000000|100%| O| |TAMS 0x00000006cc800000| PB 0x00000006cc800000| Untracked | 0 +|1420|0x00000006cd000000, 0x00000006cd800000, 0x00000006cd800000|100%| O| |TAMS 0x00000006cd000000| PB 0x00000006cd000000| Untracked | 0 +|1421|0x00000006cd800000, 0x00000006ce000000, 0x00000006ce000000|100%| O| |TAMS 0x00000006cd800000| PB 0x00000006cd800000| Untracked | 0 +|1422|0x00000006ce000000, 0x00000006ce800000, 0x00000006ce800000|100%| O| |TAMS 0x00000006ce000000| PB 0x00000006ce000000| Untracked | 0 +|1423|0x00000006ce800000, 0x00000006cf000000, 0x00000006cf000000|100%| O| |TAMS 0x00000006ce800000| PB 0x00000006ce800000| Untracked | 0 +|1424|0x00000006cf000000, 0x00000006cf800000, 0x00000006cf800000|100%| O| |TAMS 0x00000006cf000000| PB 0x00000006cf000000| Untracked | 0 +|1425|0x00000006cf800000, 0x00000006d0000000, 0x00000006d0000000|100%| O| |TAMS 0x00000006cf800000| PB 0x00000006cf800000| Untracked | 0 +|1426|0x00000006d0000000, 0x00000006d0800000, 0x00000006d0800000|100%| O| |TAMS 0x00000006d0000000| PB 0x00000006d0000000| Untracked | 0 +|1427|0x00000006d0800000, 0x00000006d1000000, 0x00000006d1000000|100%| O| |TAMS 0x00000006d0800000| PB 0x00000006d0800000| Untracked | 0 +|1428|0x00000006d1000000, 0x00000006d1800000, 0x00000006d1800000|100%| O| |TAMS 0x00000006d1000000| PB 0x00000006d1000000| Untracked | 0 +|1429|0x00000006d1800000, 0x00000006d2000000, 0x00000006d2000000|100%| O| |TAMS 0x00000006d1800000| PB 0x00000006d1800000| Untracked | 0 +|1430|0x00000006d2000000, 0x00000006d2800000, 0x00000006d2800000|100%| O| |TAMS 0x00000006d2000000| PB 0x00000006d2000000| Untracked | 0 +|1431|0x00000006d2800000, 0x00000006d3000000, 0x00000006d3000000|100%| O| |TAMS 0x00000006d2800000| PB 0x00000006d2800000| Untracked | 0 +|1432|0x00000006d3000000, 0x00000006d3800000, 0x00000006d3800000|100%| O| |TAMS 0x00000006d3000000| PB 0x00000006d3000000| Untracked | 0 +|1433|0x00000006d3800000, 0x00000006d4000000, 0x00000006d4000000|100%| O| |TAMS 0x00000006d3800000| PB 0x00000006d3800000| Untracked | 0 +|1434|0x00000006d4000000, 0x00000006d4800000, 0x00000006d4800000|100%| O| |TAMS 0x00000006d4000000| PB 0x00000006d4000000| Untracked | 0 +|1435|0x00000006d4800000, 0x00000006d5000000, 0x00000006d5000000|100%| O| |TAMS 0x00000006d4800000| PB 0x00000006d4800000| Untracked | 0 +|1436|0x00000006d5000000, 0x00000006d5800000, 0x00000006d5800000|100%| O| |TAMS 0x00000006d5000000| PB 0x00000006d5000000| Untracked | 0 +|1437|0x00000006d5800000, 0x00000006d6000000, 0x00000006d6000000|100%| O| |TAMS 0x00000006d5800000| PB 0x00000006d5800000| Untracked | 0 +|1438|0x00000006d6000000, 0x00000006d6800000, 0x00000006d6800000|100%| O| |TAMS 0x00000006d6000000| PB 0x00000006d6000000| Untracked | 0 +|1439|0x00000006d6800000, 0x00000006d7000000, 0x00000006d7000000|100%| O| |TAMS 0x00000006d6800000| PB 0x00000006d6800000| Untracked | 0 +|1440|0x00000006d7000000, 0x00000006d7800000, 0x00000006d7800000|100%| O| |TAMS 0x00000006d7000000| PB 0x00000006d7000000| Untracked | 0 +|1441|0x00000006d7800000, 0x00000006d8000000, 0x00000006d8000000|100%| O| |TAMS 0x00000006d7800000| PB 0x00000006d7800000| Untracked | 0 +|1442|0x00000006d8000000, 0x00000006d8800000, 0x00000006d8800000|100%| O| |TAMS 0x00000006d8000000| PB 0x00000006d8000000| Untracked | 0 +|1443|0x00000006d8800000, 0x00000006d9000000, 0x00000006d9000000|100%| O| |TAMS 0x00000006d8800000| PB 0x00000006d8800000| Untracked | 0 +|1444|0x00000006d9000000, 0x00000006d9800000, 0x00000006d9800000|100%| O| |TAMS 0x00000006d9000000| PB 0x00000006d9000000| Untracked | 0 +|1445|0x00000006d9800000, 0x00000006da000000, 0x00000006da000000|100%| O| |TAMS 0x00000006d9800000| PB 0x00000006d9800000| Untracked | 0 +|1446|0x00000006da000000, 0x00000006da800000, 0x00000006da800000|100%| O| |TAMS 0x00000006da000000| PB 0x00000006da000000| Untracked | 0 +|1447|0x00000006da800000, 0x00000006db000000, 0x00000006db000000|100%| O| |TAMS 0x00000006da800000| PB 0x00000006da800000| Untracked | 0 +|1448|0x00000006db000000, 0x00000006db800000, 0x00000006db800000|100%| O| |TAMS 0x00000006db000000| PB 0x00000006db000000| Untracked | 0 +|1449|0x00000006db800000, 0x00000006dc000000, 0x00000006dc000000|100%| O| |TAMS 0x00000006db800000| PB 0x00000006db800000| Untracked | 0 +|1450|0x00000006dc000000, 0x00000006dc800000, 0x00000006dc800000|100%| O| |TAMS 0x00000006dc000000| PB 0x00000006dc000000| Untracked | 0 +|1451|0x00000006dc800000, 0x00000006dd000000, 0x00000006dd000000|100%| O| |TAMS 0x00000006dc800000| PB 0x00000006dc800000| Untracked | 0 +|1452|0x00000006dd000000, 0x00000006dd800000, 0x00000006dd800000|100%| O| |TAMS 0x00000006dd000000| PB 0x00000006dd000000| Untracked | 0 +|1453|0x00000006dd800000, 0x00000006de000000, 0x00000006de000000|100%| O| |TAMS 0x00000006dd800000| PB 0x00000006dd800000| Untracked | 0 +|1454|0x00000006de000000, 0x00000006de800000, 0x00000006de800000|100%| O| |TAMS 0x00000006de000000| PB 0x00000006de000000| Untracked | 0 +|1455|0x00000006de800000, 0x00000006df000000, 0x00000006df000000|100%| O| |TAMS 0x00000006de800000| PB 0x00000006de800000| Untracked | 0 +|1456|0x00000006df000000, 0x00000006df800000, 0x00000006df800000|100%| O| |TAMS 0x00000006df000000| PB 0x00000006df000000| Untracked | 0 +|1457|0x00000006df800000, 0x00000006e0000000, 0x00000006e0000000|100%| O| |TAMS 0x00000006df800000| PB 0x00000006df800000| Untracked | 0 +|1458|0x00000006e0000000, 0x00000006e0800000, 0x00000006e0800000|100%| O| |TAMS 0x00000006e0000000| PB 0x00000006e0000000| Untracked | 0 +|1459|0x00000006e0800000, 0x00000006e1000000, 0x00000006e1000000|100%| O| |TAMS 0x00000006e0800000| PB 0x00000006e0800000| Untracked | 0 +|1460|0x00000006e1000000, 0x00000006e1800000, 0x00000006e1800000|100%| O| |TAMS 0x00000006e1000000| PB 0x00000006e1000000| Untracked | 0 +|1461|0x00000006e1800000, 0x00000006e2000000, 0x00000006e2000000|100%| O| |TAMS 0x00000006e1800000| PB 0x00000006e1800000| Untracked | 0 +|1462|0x00000006e2000000, 0x00000006e2800000, 0x00000006e2800000|100%| O| |TAMS 0x00000006e2000000| PB 0x00000006e2000000| Untracked | 0 +|1463|0x00000006e2800000, 0x00000006e3000000, 0x00000006e3000000|100%| O| |TAMS 0x00000006e2800000| PB 0x00000006e2800000| Untracked | 0 +|1464|0x00000006e3000000, 0x00000006e3800000, 0x00000006e3800000|100%| O| |TAMS 0x00000006e3000000| PB 0x00000006e3000000| Untracked | 0 +|1465|0x00000006e3800000, 0x00000006e4000000, 0x00000006e4000000|100%| O| |TAMS 0x00000006e3800000| PB 0x00000006e3800000| Untracked | 0 +|1466|0x00000006e4000000, 0x00000006e4800000, 0x00000006e4800000|100%| O| |TAMS 0x00000006e4000000| PB 0x00000006e4000000| Untracked | 0 +|1467|0x00000006e4800000, 0x00000006e5000000, 0x00000006e5000000|100%| O| |TAMS 0x00000006e4800000| PB 0x00000006e4800000| Untracked | 0 +|1468|0x00000006e5000000, 0x00000006e5800000, 0x00000006e5800000|100%| O| |TAMS 0x00000006e5000000| PB 0x00000006e5000000| Untracked | 0 +|1469|0x00000006e5800000, 0x00000006e6000000, 0x00000006e6000000|100%| O| |TAMS 0x00000006e5800000| PB 0x00000006e5800000| Untracked | 0 +|1470|0x00000006e6000000, 0x00000006e6800000, 0x00000006e6800000|100%| O| |TAMS 0x00000006e6000000| PB 0x00000006e6000000| Untracked | 0 +|1471|0x00000006e6800000, 0x00000006e7000000, 0x00000006e7000000|100%| O| |TAMS 0x00000006e6800000| PB 0x00000006e6800000| Untracked | 0 +|1472|0x00000006e7000000, 0x00000006e7800000, 0x00000006e7800000|100%| O| |TAMS 0x00000006e7000000| PB 0x00000006e7000000| Untracked | 0 +|1473|0x00000006e7800000, 0x00000006e8000000, 0x00000006e8000000|100%| O| |TAMS 0x00000006e7800000| PB 0x00000006e7800000| Untracked | 0 +|1474|0x00000006e8000000, 0x00000006e8800000, 0x00000006e8800000|100%| O| |TAMS 0x00000006e8000000| PB 0x00000006e8000000| Untracked | 0 +|1475|0x00000006e8800000, 0x00000006e9000000, 0x00000006e9000000|100%| O| |TAMS 0x00000006e8800000| PB 0x00000006e8800000| Untracked | 0 +|1476|0x00000006e9000000, 0x00000006e9800000, 0x00000006e9800000|100%| O| |TAMS 0x00000006e9000000| PB 0x00000006e9000000| Untracked | 0 +|1477|0x00000006e9800000, 0x00000006ea000000, 0x00000006ea000000|100%| O| |TAMS 0x00000006e9800000| PB 0x00000006e9800000| Untracked | 0 +|1478|0x00000006ea000000, 0x00000006ea800000, 0x00000006ea800000|100%| O| |TAMS 0x00000006ea000000| PB 0x00000006ea000000| Untracked | 0 +|1479|0x00000006ea800000, 0x00000006eb000000, 0x00000006eb000000|100%| O| |TAMS 0x00000006ea800000| PB 0x00000006ea800000| Untracked | 0 +|1480|0x00000006eb000000, 0x00000006eb800000, 0x00000006eb800000|100%| O| |TAMS 0x00000006eb000000| PB 0x00000006eb000000| Untracked | 0 +|1481|0x00000006eb800000, 0x00000006ec000000, 0x00000006ec000000|100%| O| |TAMS 0x00000006eb800000| PB 0x00000006eb800000| Untracked | 0 +|1482|0x00000006ec000000, 0x00000006ec800000, 0x00000006ec800000|100%| O| |TAMS 0x00000006ec000000| PB 0x00000006ec000000| Untracked | 0 +|1483|0x00000006ec800000, 0x00000006ed000000, 0x00000006ed000000|100%| O| |TAMS 0x00000006ec800000| PB 0x00000006ec800000| Untracked | 0 +|1484|0x00000006ed000000, 0x00000006ed800000, 0x00000006ed800000|100%| O| |TAMS 0x00000006ed000000| PB 0x00000006ed000000| Untracked | 0 +|1485|0x00000006ed800000, 0x00000006ee000000, 0x00000006ee000000|100%| O| |TAMS 0x00000006ed800000| PB 0x00000006ed800000| Untracked | 0 +|1486|0x00000006ee000000, 0x00000006ee800000, 0x00000006ee800000|100%| O| |TAMS 0x00000006ee000000| PB 0x00000006ee000000| Untracked | 0 +|1487|0x00000006ee800000, 0x00000006ef000000, 0x00000006ef000000|100%| O| |TAMS 0x00000006ee800000| PB 0x00000006ee800000| Untracked | 0 +|1488|0x00000006ef000000, 0x00000006ef800000, 0x00000006ef800000|100%| O| |TAMS 0x00000006ef000000| PB 0x00000006ef000000| Untracked | 0 +|1489|0x00000006ef800000, 0x00000006f0000000, 0x00000006f0000000|100%| O| |TAMS 0x00000006ef800000| PB 0x00000006ef800000| Untracked | 0 +|1490|0x00000006f0000000, 0x00000006f0800000, 0x00000006f0800000|100%| O| |TAMS 0x00000006f0000000| PB 0x00000006f0000000| Untracked | 0 +|1491|0x00000006f0800000, 0x00000006f1000000, 0x00000006f1000000|100%| O| |TAMS 0x00000006f0800000| PB 0x00000006f0800000| Untracked | 0 +|1492|0x00000006f1000000, 0x00000006f1800000, 0x00000006f1800000|100%| O| |TAMS 0x00000006f1000000| PB 0x00000006f1000000| Untracked | 0 +|1493|0x00000006f1800000, 0x00000006f2000000, 0x00000006f2000000|100%| O| |TAMS 0x00000006f1800000| PB 0x00000006f1800000| Untracked | 0 +|1494|0x00000006f2000000, 0x00000006f2800000, 0x00000006f2800000|100%| O| |TAMS 0x00000006f2000000| PB 0x00000006f2000000| Untracked | 0 +|1495|0x00000006f2800000, 0x00000006f3000000, 0x00000006f3000000|100%| O| |TAMS 0x00000006f2800000| PB 0x00000006f2800000| Untracked | 0 +|1496|0x00000006f3000000, 0x00000006f3800000, 0x00000006f3800000|100%| O| |TAMS 0x00000006f3000000| PB 0x00000006f3000000| Untracked | 0 +|1497|0x00000006f3800000, 0x00000006f4000000, 0x00000006f4000000|100%| O| |TAMS 0x00000006f3800000| PB 0x00000006f3800000| Untracked | 0 +|1498|0x00000006f4000000, 0x00000006f4800000, 0x00000006f4800000|100%| O| |TAMS 0x00000006f4000000| PB 0x00000006f4000000| Untracked | 0 +|1499|0x00000006f4800000, 0x00000006f5000000, 0x00000006f5000000|100%| O| |TAMS 0x00000006f4800000| PB 0x00000006f4800000| Untracked | 0 +|1500|0x00000006f5000000, 0x00000006f5800000, 0x00000006f5800000|100%| O| |TAMS 0x00000006f5000000| PB 0x00000006f5000000| Untracked | 0 +|1501|0x00000006f5800000, 0x00000006f6000000, 0x00000006f6000000|100%| O| |TAMS 0x00000006f5800000| PB 0x00000006f5800000| Untracked | 0 +|1502|0x00000006f6000000, 0x00000006f6800000, 0x00000006f6800000|100%| O| |TAMS 0x00000006f6000000| PB 0x00000006f6000000| Untracked | 0 +|1503|0x00000006f6800000, 0x00000006f7000000, 0x00000006f7000000|100%| O| |TAMS 0x00000006f6800000| PB 0x00000006f6800000| Untracked | 0 +|1504|0x00000006f7000000, 0x00000006f7800000, 0x00000006f7800000|100%| O| |TAMS 0x00000006f7000000| PB 0x00000006f7000000| Untracked | 0 +|1505|0x00000006f7800000, 0x00000006f8000000, 0x00000006f8000000|100%| O| |TAMS 0x00000006f7800000| PB 0x00000006f7800000| Untracked | 0 +|1506|0x00000006f8000000, 0x00000006f8800000, 0x00000006f8800000|100%| O| |TAMS 0x00000006f8000000| PB 0x00000006f8000000| Untracked | 0 +|1507|0x00000006f8800000, 0x00000006f9000000, 0x00000006f9000000|100%| O| |TAMS 0x00000006f8800000| PB 0x00000006f8800000| Untracked | 0 +|1508|0x00000006f9000000, 0x00000006f9800000, 0x00000006f9800000|100%| O| |TAMS 0x00000006f9000000| PB 0x00000006f9000000| Untracked | 0 +|1509|0x00000006f9800000, 0x00000006fa000000, 0x00000006fa000000|100%| O| |TAMS 0x00000006f9800000| PB 0x00000006f9800000| Untracked | 0 +|1510|0x00000006fa000000, 0x00000006fa800000, 0x00000006fa800000|100%| O| |TAMS 0x00000006fa000000| PB 0x00000006fa000000| Untracked | 0 +|1511|0x00000006fa800000, 0x00000006fb000000, 0x00000006fb000000|100%| O| |TAMS 0x00000006fa800000| PB 0x00000006fa800000| Untracked | 0 +|1512|0x00000006fb000000, 0x00000006fb800000, 0x00000006fb800000|100%| O| |TAMS 0x00000006fb000000| PB 0x00000006fb000000| Untracked | 0 +|1513|0x00000006fb800000, 0x00000006fc000000, 0x00000006fc000000|100%| O| |TAMS 0x00000006fb800000| PB 0x00000006fb800000| Untracked | 0 +|1514|0x00000006fc000000, 0x00000006fc800000, 0x00000006fc800000|100%| O| |TAMS 0x00000006fc000000| PB 0x00000006fc000000| Untracked | 0 +|1515|0x00000006fc800000, 0x00000006fd000000, 0x00000006fd000000|100%| O| |TAMS 0x00000006fc800000| PB 0x00000006fc800000| Untracked | 0 +|1516|0x00000006fd000000, 0x00000006fd800000, 0x00000006fd800000|100%| O| |TAMS 0x00000006fd000000| PB 0x00000006fd000000| Untracked | 0 +|1517|0x00000006fd800000, 0x00000006fe000000, 0x00000006fe000000|100%| O| |TAMS 0x00000006fd800000| PB 0x00000006fd800000| Untracked | 0 +|1518|0x00000006fe000000, 0x00000006fe800000, 0x00000006fe800000|100%| O| |TAMS 0x00000006fe000000| PB 0x00000006fe000000| Untracked | 0 +|1519|0x00000006fe800000, 0x00000006ff000000, 0x00000006ff000000|100%| O| |TAMS 0x00000006fe800000| PB 0x00000006fe800000| Untracked | 0 +|1520|0x00000006ff000000, 0x00000006ff800000, 0x00000006ff800000|100%| O| |TAMS 0x00000006ff000000| PB 0x00000006ff000000| Untracked | 0 +|1521|0x00000006ff800000, 0x0000000700000000, 0x0000000700000000|100%| O| |TAMS 0x00000006ff800000| PB 0x00000006ff800000| Untracked | 0 +|1522|0x0000000700000000, 0x0000000700800000, 0x0000000700800000|100%| O| |TAMS 0x0000000700000000| PB 0x0000000700000000| Untracked | 0 +|1523|0x0000000700800000, 0x0000000701000000, 0x0000000701000000|100%| O| |TAMS 0x0000000700800000| PB 0x0000000700800000| Untracked | 0 +|1524|0x0000000701000000, 0x0000000701800000, 0x0000000701800000|100%| O| |TAMS 0x0000000701000000| PB 0x0000000701000000| Untracked | 0 +|1525|0x0000000701800000, 0x0000000702000000, 0x0000000702000000|100%| O| |TAMS 0x0000000701800000| PB 0x0000000701800000| Untracked | 0 +|1526|0x0000000702000000, 0x0000000702800000, 0x0000000702800000|100%| O| |TAMS 0x0000000702000000| PB 0x0000000702000000| Untracked | 0 +|1527|0x0000000702800000, 0x0000000703000000, 0x0000000703000000|100%| O| |TAMS 0x0000000702800000| PB 0x0000000702800000| Untracked | 0 +|1528|0x0000000703000000, 0x0000000703800000, 0x0000000703800000|100%| O| |TAMS 0x0000000703000000| PB 0x0000000703000000| Untracked | 0 +|1529|0x0000000703800000, 0x0000000703800000, 0x0000000704000000| 0%| F| |TAMS 0x0000000703800000| PB 0x0000000703800000| Untracked | 0 +|1530|0x0000000704000000, 0x0000000704000000, 0x0000000704800000| 0%| F| |TAMS 0x0000000704000000| PB 0x0000000704000000| Untracked | 0 +|1531|0x0000000704800000, 0x0000000704800000, 0x0000000705000000| 0%| F| |TAMS 0x0000000704800000| PB 0x0000000704800000| Untracked | 0 +|1532|0x0000000705000000, 0x0000000705000000, 0x0000000705800000| 0%| F| |TAMS 0x0000000705000000| PB 0x0000000705000000| Untracked | 0 +|1659|0x0000000744800000, 0x0000000745000000, 0x0000000745000000|100%| O| |TAMS 0x0000000744800000| PB 0x0000000744800000| Untracked | 0 +|1660|0x0000000745000000, 0x0000000745800000, 0x0000000745800000|100%| O| |TAMS 0x0000000745000000| PB 0x0000000745000000| Untracked | 0 +|1661|0x0000000745800000, 0x0000000746000000, 0x0000000746000000|100%| O| |TAMS 0x0000000745800000| PB 0x0000000745800000| Untracked | 0 +|1662|0x0000000746000000, 0x0000000746800000, 0x0000000746800000|100%| O| |TAMS 0x0000000746000000| PB 0x0000000746000000| Untracked | 0 +|1663|0x0000000746800000, 0x0000000747000000, 0x0000000747000000|100%| O| |TAMS 0x0000000746800000| PB 0x0000000746800000| Untracked | 0 +|1664|0x0000000747000000, 0x0000000747800000, 0x0000000747800000|100%| O| |TAMS 0x0000000747000000| PB 0x0000000747000000| Untracked | 0 +|1665|0x0000000747800000, 0x0000000748000000, 0x0000000748000000|100%| O| |TAMS 0x0000000747800000| PB 0x0000000747800000| Untracked | 0 +|1666|0x0000000748000000, 0x000000074821c248, 0x0000000748800000| 26%| O| |TAMS 0x0000000748000000| PB 0x0000000748000000| Untracked | 0 +|1869|0x00000007ad800000, 0x00000007ad800000, 0x00000007ae000000| 0%| F| |TAMS 0x00000007ad800000| PB 0x00000007ad800000| Untracked | 0 +|1870|0x00000007ae000000, 0x00000007ae000000, 0x00000007ae800000| 0%| F| |TAMS 0x00000007ae000000| PB 0x00000007ae000000| Untracked | 0 +|1871|0x00000007ae800000, 0x00000007ae800000, 0x00000007af000000| 0%| F| |TAMS 0x00000007ae800000| PB 0x00000007ae800000| Untracked | 0 +|1872|0x00000007af000000, 0x00000007af000000, 0x00000007af800000| 0%| F| |TAMS 0x00000007af000000| PB 0x00000007af000000| Untracked | 0 +|1873|0x00000007af800000, 0x00000007af800000, 0x00000007b0000000| 0%| F| |TAMS 0x00000007af800000| PB 0x00000007af800000| Untracked | 0 +|1874|0x00000007b0000000, 0x00000007b0000000, 0x00000007b0800000| 0%| F| |TAMS 0x00000007b0000000| PB 0x00000007b0000000| Untracked | 0 +|1875|0x00000007b0800000, 0x00000007b0800000, 0x00000007b1000000| 0%| F| |TAMS 0x00000007b0800000| PB 0x00000007b0800000| Untracked | 0 +|1876|0x00000007b1000000, 0x00000007b1000000, 0x00000007b1800000| 0%| F| |TAMS 0x00000007b1000000| PB 0x00000007b1000000| Untracked | 0 +|1877|0x00000007b1800000, 0x00000007b1800000, 0x00000007b2000000| 0%| F| |TAMS 0x00000007b1800000| PB 0x00000007b1800000| Untracked | 0 +|1878|0x00000007b2000000, 0x00000007b2000000, 0x00000007b2800000| 0%| F| |TAMS 0x00000007b2000000| PB 0x00000007b2000000| Untracked | 0 +|1879|0x00000007b2800000, 0x00000007b2800000, 0x00000007b3000000| 0%| F| |TAMS 0x00000007b2800000| PB 0x00000007b2800000| Untracked | 0 +|1880|0x00000007b3000000, 0x00000007b3000000, 0x00000007b3800000| 0%| F| |TAMS 0x00000007b3000000| PB 0x00000007b3000000| Untracked | 0 +|1881|0x00000007b3800000, 0x00000007b3800000, 0x00000007b4000000| 0%| F| |TAMS 0x00000007b3800000| PB 0x00000007b3800000| Untracked | 0 +|1882|0x00000007b4000000, 0x00000007b4000000, 0x00000007b4800000| 0%| F| |TAMS 0x00000007b4000000| PB 0x00000007b4000000| Untracked | 0 +|1883|0x00000007b4800000, 0x00000007b4800000, 0x00000007b5000000| 0%| F| |TAMS 0x00000007b4800000| PB 0x00000007b4800000| Untracked | 0 +|1884|0x00000007b5000000, 0x00000007b5000000, 0x00000007b5800000| 0%| F| |TAMS 0x00000007b5000000| PB 0x00000007b5000000| Untracked | 0 +|1885|0x00000007b5800000, 0x00000007b5800000, 0x00000007b6000000| 0%| F| |TAMS 0x00000007b5800000| PB 0x00000007b5800000| Untracked | 0 +|1886|0x00000007b6000000, 0x00000007b6000000, 0x00000007b6800000| 0%| F| |TAMS 0x00000007b6000000| PB 0x00000007b6000000| Untracked | 0 +|1887|0x00000007b6800000, 0x00000007b6800000, 0x00000007b7000000| 0%| F| |TAMS 0x00000007b6800000| PB 0x00000007b6800000| Untracked | 0 +|1888|0x00000007b7000000, 0x00000007b7000000, 0x00000007b7800000| 0%| F| |TAMS 0x00000007b7000000| PB 0x00000007b7000000| Untracked | 0 +|1889|0x00000007b7800000, 0x00000007b7800000, 0x00000007b8000000| 0%| F| |TAMS 0x00000007b7800000| PB 0x00000007b7800000| Untracked | 0 +|1890|0x00000007b8000000, 0x00000007b8000000, 0x00000007b8800000| 0%| F| |TAMS 0x00000007b8000000| PB 0x00000007b8000000| Untracked | 0 +|1891|0x00000007b8800000, 0x00000007b8800000, 0x00000007b9000000| 0%| F| |TAMS 0x00000007b8800000| PB 0x00000007b8800000| Untracked | 0 +|1892|0x00000007b9000000, 0x00000007b9000000, 0x00000007b9800000| 0%| F| |TAMS 0x00000007b9000000| PB 0x00000007b9000000| Untracked | 0 +|1893|0x00000007b9800000, 0x00000007b9800000, 0x00000007ba000000| 0%| F| |TAMS 0x00000007b9800000| PB 0x00000007b9800000| Untracked | 0 +|1894|0x00000007ba000000, 0x00000007ba000000, 0x00000007ba800000| 0%| F| |TAMS 0x00000007ba000000| PB 0x00000007ba000000| Untracked | 0 +|1895|0x00000007ba800000, 0x00000007ba800000, 0x00000007bb000000| 0%| F| |TAMS 0x00000007ba800000| PB 0x00000007ba800000| Untracked | 0 +|1896|0x00000007bb000000, 0x00000007bb000000, 0x00000007bb800000| 0%| F| |TAMS 0x00000007bb000000| PB 0x00000007bb000000| Untracked | 0 +|1897|0x00000007bb800000, 0x00000007bb800000, 0x00000007bc000000| 0%| F| |TAMS 0x00000007bb800000| PB 0x00000007bb800000| Untracked | 0 +|1898|0x00000007bc000000, 0x00000007bc000000, 0x00000007bc800000| 0%| F| |TAMS 0x00000007bc000000| PB 0x00000007bc000000| Untracked | 0 +|1899|0x00000007bc800000, 0x00000007bc800000, 0x00000007bd000000| 0%| F| |TAMS 0x00000007bc800000| PB 0x00000007bc800000| Untracked | 0 +|1900|0x00000007bd000000, 0x00000007bd000000, 0x00000007bd800000| 0%| F| |TAMS 0x00000007bd000000| PB 0x00000007bd000000| Untracked | 0 +|1901|0x00000007bd800000, 0x00000007bd800000, 0x00000007be000000| 0%| F| |TAMS 0x00000007bd800000| PB 0x00000007bd800000| Untracked | 0 +|1902|0x00000007be000000, 0x00000007be800000, 0x00000007be800000|100%| S|CS|TAMS 0x00000007be000000| PB 0x00000007be000000| Complete | 0 +|1903|0x00000007be800000, 0x00000007bf000000, 0x00000007bf000000|100%| S|CS|TAMS 0x00000007be800000| PB 0x00000007be800000| Complete | 0 +|1904|0x00000007bf000000, 0x00000007bf800000, 0x00000007bf800000|100%| S|CS|TAMS 0x00000007bf000000| PB 0x00000007bf000000| Complete | 0 +|1905|0x00000007bf800000, 0x00000007c0000000, 0x00000007c0000000|100%| S|CS|TAMS 0x00000007bf800000| PB 0x00000007bf800000| Complete | 0 +|1906|0x00000007c0000000, 0x00000007c0800000, 0x00000007c0800000|100%| S|CS|TAMS 0x00000007c0000000| PB 0x00000007c0000000| Complete | 0 +|1907|0x00000007c0800000, 0x00000007c1000000, 0x00000007c1000000|100%| S|CS|TAMS 0x00000007c0800000| PB 0x00000007c0800000| Complete | 0 +|1908|0x00000007c1000000, 0x00000007c1800000, 0x00000007c1800000|100%| S|CS|TAMS 0x00000007c1000000| PB 0x00000007c1000000| Complete | 0 +|1909|0x00000007c1800000, 0x00000007c2000000, 0x00000007c2000000|100%| S|CS|TAMS 0x00000007c1800000| PB 0x00000007c1800000| Complete | 0 +|1910|0x00000007c2000000, 0x00000007c2800000, 0x00000007c2800000|100%| S|CS|TAMS 0x00000007c2000000| PB 0x00000007c2000000| Complete | 0 +|1911|0x00000007c2800000, 0x00000007c3000000, 0x00000007c3000000|100%| S|CS|TAMS 0x00000007c2800000| PB 0x00000007c2800000| Complete | 0 +|1912|0x00000007c3000000, 0x00000007c3800000, 0x00000007c3800000|100%| S|CS|TAMS 0x00000007c3000000| PB 0x00000007c3000000| Complete | 0 +|1913|0x00000007c3800000, 0x00000007c3800000, 0x00000007c4000000| 0%| F| |TAMS 0x00000007c3800000| PB 0x00000007c3800000| Untracked | 0 +|1914|0x00000007c4000000, 0x00000007c4000000, 0x00000007c4800000| 0%| F| |TAMS 0x00000007c4000000| PB 0x00000007c4000000| Untracked | 0 +|1915|0x00000007c4800000, 0x00000007c4800000, 0x00000007c5000000| 0%| F| |TAMS 0x00000007c4800000| PB 0x00000007c4800000| Untracked | 0 +|1916|0x00000007c5000000, 0x00000007c5000000, 0x00000007c5800000| 0%| F| |TAMS 0x00000007c5000000| PB 0x00000007c5000000| Untracked | 0 +|1917|0x00000007c5800000, 0x00000007c5800000, 0x00000007c6000000| 0%| F| |TAMS 0x00000007c5800000| PB 0x00000007c5800000| Untracked | 0 +|1918|0x00000007c6000000, 0x00000007c6000000, 0x00000007c6800000| 0%| F| |TAMS 0x00000007c6000000| PB 0x00000007c6000000| Untracked | 0 +|1919|0x00000007c6800000, 0x00000007c6800000, 0x00000007c7000000| 0%| F| |TAMS 0x00000007c6800000| PB 0x00000007c6800000| Untracked | 0 +|1920|0x00000007c7000000, 0x00000007c7000000, 0x00000007c7800000| 0%| F| |TAMS 0x00000007c7000000| PB 0x00000007c7000000| Untracked | 0 +|1921|0x00000007c7800000, 0x00000007c7800000, 0x00000007c8000000| 0%| F| |TAMS 0x00000007c7800000| PB 0x00000007c7800000| Untracked | 0 +|1922|0x00000007c8000000, 0x00000007c8000000, 0x00000007c8800000| 0%| F| |TAMS 0x00000007c8000000| PB 0x00000007c8000000| Untracked | 0 +|1923|0x00000007c8800000, 0x00000007c8800000, 0x00000007c9000000| 0%| F| |TAMS 0x00000007c8800000| PB 0x00000007c8800000| Untracked | 0 +|1924|0x00000007c9000000, 0x00000007c9000000, 0x00000007c9800000| 0%| F| |TAMS 0x00000007c9000000| PB 0x00000007c9000000| Untracked | 0 +|1925|0x00000007c9800000, 0x00000007c9800000, 0x00000007ca000000| 0%| F| |TAMS 0x00000007c9800000| PB 0x00000007c9800000| Untracked | 0 +|1926|0x00000007ca000000, 0x00000007ca000000, 0x00000007ca800000| 0%| F| |TAMS 0x00000007ca000000| PB 0x00000007ca000000| Untracked | 0 +|1927|0x00000007ca800000, 0x00000007ca800000, 0x00000007cb000000| 0%| F| |TAMS 0x00000007ca800000| PB 0x00000007ca800000| Untracked | 0 +|1928|0x00000007cb000000, 0x00000007cb000000, 0x00000007cb800000| 0%| F| |TAMS 0x00000007cb000000| PB 0x00000007cb000000| Untracked | 0 +|1929|0x00000007cb800000, 0x00000007cb800000, 0x00000007cc000000| 0%| F| |TAMS 0x00000007cb800000| PB 0x00000007cb800000| Untracked | 0 +|1930|0x00000007cc000000, 0x00000007cc000000, 0x00000007cc800000| 0%| F| |TAMS 0x00000007cc000000| PB 0x00000007cc000000| Untracked | 0 +|1931|0x00000007cc800000, 0x00000007cc800000, 0x00000007cd000000| 0%| F| |TAMS 0x00000007cc800000| PB 0x00000007cc800000| Untracked | 0 +|1932|0x00000007cd000000, 0x00000007cd000000, 0x00000007cd800000| 0%| F| |TAMS 0x00000007cd000000| PB 0x00000007cd000000| Untracked | 0 +|1933|0x00000007cd800000, 0x00000007cd800000, 0x00000007ce000000| 0%| F| |TAMS 0x00000007cd800000| PB 0x00000007cd800000| Untracked | 0 +|1934|0x00000007ce000000, 0x00000007ce000000, 0x00000007ce800000| 0%| F| |TAMS 0x00000007ce000000| PB 0x00000007ce000000| Untracked | 0 +|1935|0x00000007ce800000, 0x00000007ce800000, 0x00000007cf000000| 0%| F| |TAMS 0x00000007ce800000| PB 0x00000007ce800000| Untracked | 0 +|1936|0x00000007cf000000, 0x00000007cf000000, 0x00000007cf800000| 0%| F| |TAMS 0x00000007cf000000| PB 0x00000007cf000000| Untracked | 0 +|1937|0x00000007cf800000, 0x00000007cf800000, 0x00000007d0000000| 0%| F| |TAMS 0x00000007cf800000| PB 0x00000007cf800000| Untracked | 0 +|1938|0x00000007d0000000, 0x00000007d0000000, 0x00000007d0800000| 0%| F| |TAMS 0x00000007d0000000| PB 0x00000007d0000000| Untracked | 0 +|1939|0x00000007d0800000, 0x00000007d0800000, 0x00000007d1000000| 0%| F| |TAMS 0x00000007d0800000| PB 0x00000007d0800000| Untracked | 0 +|1940|0x00000007d1000000, 0x00000007d1000000, 0x00000007d1800000| 0%| F| |TAMS 0x00000007d1000000| PB 0x00000007d1000000| Untracked | 0 +|1941|0x00000007d1800000, 0x00000007d1800000, 0x00000007d2000000| 0%| F| |TAMS 0x00000007d1800000| PB 0x00000007d1800000| Untracked | 0 +|1942|0x00000007d2000000, 0x00000007d2000000, 0x00000007d2800000| 0%| F| |TAMS 0x00000007d2000000| PB 0x00000007d2000000| Untracked | 0 +|1943|0x00000007d2800000, 0x00000007d2800000, 0x00000007d3000000| 0%| F| |TAMS 0x00000007d2800000| PB 0x00000007d2800000| Untracked | 0 +|1944|0x00000007d3000000, 0x00000007d3000000, 0x00000007d3800000| 0%| F| |TAMS 0x00000007d3000000| PB 0x00000007d3000000| Untracked | 0 +|1945|0x00000007d3800000, 0x00000007d3800000, 0x00000007d4000000| 0%| F| |TAMS 0x00000007d3800000| PB 0x00000007d3800000| Untracked | 0 +|1946|0x00000007d4000000, 0x00000007d4000000, 0x00000007d4800000| 0%| F| |TAMS 0x00000007d4000000| PB 0x00000007d4000000| Untracked | 0 +|1947|0x00000007d4800000, 0x00000007d4800000, 0x00000007d5000000| 0%| F| |TAMS 0x00000007d4800000| PB 0x00000007d4800000| Untracked | 0 +|1948|0x00000007d5000000, 0x00000007d5000000, 0x00000007d5800000| 0%| F| |TAMS 0x00000007d5000000| PB 0x00000007d5000000| Untracked | 0 +|1949|0x00000007d5800000, 0x00000007d5800000, 0x00000007d6000000| 0%| F| |TAMS 0x00000007d5800000| PB 0x00000007d5800000| Untracked | 0 +|1956|0x00000007d9000000, 0x00000007d9000000, 0x00000007d9800000| 0%| F| |TAMS 0x00000007d9000000| PB 0x00000007d9000000| Untracked | 0 +|1957|0x00000007d9800000, 0x00000007d9800000, 0x00000007da000000| 0%| F| |TAMS 0x00000007d9800000| PB 0x00000007d9800000| Untracked | 0 +|1958|0x00000007da000000, 0x00000007da000000, 0x00000007da800000| 0%| F| |TAMS 0x00000007da000000| PB 0x00000007da000000| Untracked | 0 +|1959|0x00000007da800000, 0x00000007da800000, 0x00000007db000000| 0%| F| |TAMS 0x00000007da800000| PB 0x00000007da800000| Untracked | 0 +|1960|0x00000007db000000, 0x00000007db000000, 0x00000007db800000| 0%| F| |TAMS 0x00000007db000000| PB 0x00000007db000000| Untracked | 0 +|1961|0x00000007db800000, 0x00000007db800000, 0x00000007dc000000| 0%| F| |TAMS 0x00000007db800000| PB 0x00000007db800000| Untracked | 0 +|1962|0x00000007dc000000, 0x00000007dc000000, 0x00000007dc800000| 0%| F| |TAMS 0x00000007dc000000| PB 0x00000007dc000000| Untracked | 0 +|1963|0x00000007dc800000, 0x00000007dc800000, 0x00000007dd000000| 0%| F| |TAMS 0x00000007dc800000| PB 0x00000007dc800000| Untracked | 0 +|1964|0x00000007dd000000, 0x00000007dd000000, 0x00000007dd800000| 0%| F| |TAMS 0x00000007dd000000| PB 0x00000007dd000000| Untracked | 0 +|1965|0x00000007dd800000, 0x00000007dd800000, 0x00000007de000000| 0%| F| |TAMS 0x00000007dd800000| PB 0x00000007dd800000| Untracked | 0 +|1966|0x00000007de000000, 0x00000007de000000, 0x00000007de800000| 0%| F| |TAMS 0x00000007de000000| PB 0x00000007de000000| Untracked | 0 +|1967|0x00000007de800000, 0x00000007de800000, 0x00000007df000000| 0%| F| |TAMS 0x00000007de800000| PB 0x00000007de800000| Untracked | 0 +|1968|0x00000007df000000, 0x00000007df000000, 0x00000007df800000| 0%| F| |TAMS 0x00000007df000000| PB 0x00000007df000000| Untracked | 0 +|1969|0x00000007df800000, 0x00000007df800000, 0x00000007e0000000| 0%| F| |TAMS 0x00000007df800000| PB 0x00000007df800000| Untracked | 0 +|1970|0x00000007e0000000, 0x00000007e0000000, 0x00000007e0800000| 0%| F| |TAMS 0x00000007e0000000| PB 0x00000007e0000000| Untracked | 0 +|1971|0x00000007e0800000, 0x00000007e0800000, 0x00000007e1000000| 0%| F| |TAMS 0x00000007e0800000| PB 0x00000007e0800000| Untracked | 0 +|1972|0x00000007e1000000, 0x00000007e1000000, 0x00000007e1800000| 0%| F| |TAMS 0x00000007e1000000| PB 0x00000007e1000000| Untracked | 0 +|1973|0x00000007e1800000, 0x00000007e1800000, 0x00000007e2000000| 0%| F| |TAMS 0x00000007e1800000| PB 0x00000007e1800000| Untracked | 0 +|1974|0x00000007e2000000, 0x00000007e2000000, 0x00000007e2800000| 0%| F| |TAMS 0x00000007e2000000| PB 0x00000007e2000000| Untracked | 0 +|1975|0x00000007e2800000, 0x00000007e2800000, 0x00000007e3000000| 0%| F| |TAMS 0x00000007e2800000| PB 0x00000007e2800000| Untracked | 0 +|1976|0x00000007e3000000, 0x00000007e3000000, 0x00000007e3800000| 0%| F| |TAMS 0x00000007e3000000| PB 0x00000007e3000000| Untracked | 0 +|1977|0x00000007e3800000, 0x00000007e3800000, 0x00000007e4000000| 0%| F| |TAMS 0x00000007e3800000| PB 0x00000007e3800000| Untracked | 0 +|1978|0x00000007e4000000, 0x00000007e4000000, 0x00000007e4800000| 0%| F| |TAMS 0x00000007e4000000| PB 0x00000007e4000000| Untracked | 0 +|1979|0x00000007e4800000, 0x00000007e4800000, 0x00000007e5000000| 0%| F| |TAMS 0x00000007e4800000| PB 0x00000007e4800000| Untracked | 0 +|1980|0x00000007e5000000, 0x00000007e5000000, 0x00000007e5800000| 0%| F| |TAMS 0x00000007e5000000| PB 0x00000007e5000000| Untracked | 0 +|1981|0x00000007e5800000, 0x00000007e5800000, 0x00000007e6000000| 0%| F| |TAMS 0x00000007e5800000| PB 0x00000007e5800000| Untracked | 0 +|1982|0x00000007e6000000, 0x00000007e6000000, 0x00000007e6800000| 0%| F| |TAMS 0x00000007e6000000| PB 0x00000007e6000000| Untracked | 0 +|1983|0x00000007e6800000, 0x00000007e6800000, 0x00000007e7000000| 0%| F| |TAMS 0x00000007e6800000| PB 0x00000007e6800000| Untracked | 0 +|1984|0x00000007e7000000, 0x00000007e7000000, 0x00000007e7800000| 0%| F| |TAMS 0x00000007e7000000| PB 0x00000007e7000000| Untracked | 0 +|1985|0x00000007e7800000, 0x00000007e7800000, 0x00000007e8000000| 0%| F| |TAMS 0x00000007e7800000| PB 0x00000007e7800000| Untracked | 0 +|1986|0x00000007e8000000, 0x00000007e8000000, 0x00000007e8800000| 0%| F| |TAMS 0x00000007e8000000| PB 0x00000007e8000000| Untracked | 0 +|1987|0x00000007e8800000, 0x00000007e8800000, 0x00000007e9000000| 0%| F| |TAMS 0x00000007e8800000| PB 0x00000007e8800000| Untracked | 0 +|1988|0x00000007e9000000, 0x00000007e9000000, 0x00000007e9800000| 0%| F| |TAMS 0x00000007e9000000| PB 0x00000007e9000000| Untracked | 0 +|1989|0x00000007e9800000, 0x00000007e9800000, 0x00000007ea000000| 0%| F| |TAMS 0x00000007e9800000| PB 0x00000007e9800000| Untracked | 0 + +Card table byte_map: [0x0000016c01fd0000,0x0000016c03fa0000] _byte_map_base: 0x0000016bfff98000 + +Marking Bits: (CMBitMap*) 0x0000016c7e6600a0 + Bits: [0x0000016c03fa0000, 0x0000016c13de0000) + +Polling page: 0x0000016c60f40000 + +Metaspace: + +Usage: + Non-class: 1.16 MB used. + Class: 58.49 KB used. + Both: 1.22 MB used. + +Virtual space: + Non-class space: 64.00 MB reserved, 1.25 MB ( 2%) committed, 1 nodes. + Class space: 1.00 GB reserved, 128.00 KB ( <1%) committed, 1 nodes. + Both: 1.06 GB reserved, 1.38 MB ( <1%) committed. + +Chunk freelists: + Non-Class: 11.86 MB + Class: 15.73 MB + Both: 27.59 MB + +MaxMetaspaceSize: unlimited +CompressedClassSpaceSize: 1.00 GB +Initial GC threshold: 21.00 MB +Current GC threshold: 21.00 MB +CDS: on + - commit_granule_bytes: 65536. + - commit_granule_words: 8192. + - virtual_space_node_default_size: 8388608. + - enlarge_chunks_in_place: 1. + - use_allocation_guard: 0. + + +Internal statistics: + +num_allocs_failed_limit: 0. +num_arena_births: 16. +num_arena_deaths: 0. +num_vsnodes_births: 2. +num_vsnodes_deaths: 0. +num_space_committed: 22. +num_space_uncommitted: 0. +num_chunks_returned_to_freelist: 0. +num_chunks_taken_from_freelist: 26. +num_chunk_merges: 0. +num_chunk_splits: 16. +num_chunks_enlarged: 11. +num_inconsistent_stats: 0. + +CodeHeap 'non-profiled nmethods': size=117248Kb used=895Kb max_used=1177Kb free=116352Kb + bounds [0x0000016c74e30000, 0x0000016c750a0000, 0x0000016c7c0b0000] +CodeHeap 'profiled nmethods': size=117184Kb used=934Kb max_used=941Kb free=116249Kb + bounds [0x0000016c6d0b0000, 0x0000016c6d320000, 0x0000016c74320000] +CodeHeap 'non-nmethods': size=11328Kb used=1303Kb max_used=6373Kb free=10024Kb + bounds [0x0000016c74320000, 0x0000016c74970000, 0x0000016c74e30000] +CodeCache: size=245760Kb, used=3132Kb, max_used=8491Kb, free=242625Kb + total_blobs=1198, nmethods=785, adapters=327, full_count=0 +Compilation: enabled, stopped_count=0, restarted_count=0 + +JVMCI Events (20 events): +Event: 253.792 Thread 0x0000016c58109860 initializing JVMCI runtime 3 +Event: 253.792 Thread 0x0000016c58109860 done waiting for JavaVM references initialization in JVMCI runtime 3 +Event: 253.792 Thread 0x0000016c58109860 initialized JVMCI runtime 3 +Event: 255.221 Thread 0x0000016c58109860 detaching from JVMCI runtime 3: releasing idle compiler thread (0 other threads still attached) +Event: 255.221 Thread 0x0000016c58109860 shutting down HotSpotJVMCIRuntime for JVMCI runtime 3 +Event: 255.221 Thread 0x0000016c58109860 shut down JVMCI runtime 3 +Event: 255.227 Thread 0x0000016c58109860 destroyed JavaVM[28]@0x0000016c80a1bd38 for JVMCI runtime 3 +Event: 255.227 Thread 0x0000016c58109860 releasing handles for JVMCI runtime 3: oop handles=101, metadata handles={total=251, live=238, blocks=12} +Event: 255.227 Thread 0x0000016c58109860 detached from JVMCI runtime 3 +Event: 258.467 Thread 0x0000016c58109860 attached to JVMCI runtime 3 +Event: 258.473 Thread 0x0000016c58109860 created JavaVM[29]@0x0000016c80a1bd38 for JVMCI runtime 3 +Event: 258.473 Thread 0x0000016c58109860 initializing JVMCI runtime 3 +Event: 258.473 Thread 0x0000016c58109860 done waiting for JavaVM references initialization in JVMCI runtime 3 +Event: 258.473 Thread 0x0000016c58109860 initialized JVMCI runtime 3 +Event: 259.496 Thread 0x0000016c58109860 detaching from JVMCI runtime 3: releasing idle compiler thread (0 other threads still attached) +Event: 259.496 Thread 0x0000016c58109860 shutting down HotSpotJVMCIRuntime for JVMCI runtime 3 +Event: 259.496 Thread 0x0000016c58109860 shut down JVMCI runtime 3 +Event: 259.498 Thread 0x0000016c58109860 destroyed JavaVM[29]@0x0000016c80a1bd38 for JVMCI runtime 3 +Event: 259.498 Thread 0x0000016c58109860 releasing handles for JVMCI runtime 3: oop handles=52, metadata handles={total=90, live=78, blocks=12} +Event: 259.498 Thread 0x0000016c58109860 detached from JVMCI runtime 3 + +Compilation events (20 events): +Event: 215.121 Thread 0x0000016c5810ad60 1025 3 java.util.concurrent.ForkJoinPool::tryTrim (209 bytes) +Event: 215.122 Thread 0x0000016c5810ad60 nmethod 1025 0x0000016c6d169108 code [0x0000016c6d169260, 0x0000016c6d1697e8] +Event: 216.227 Thread 0x0000016c5810ad60 1026 ! 3 java.util.concurrent.ForkJoinTask::awaitDone (350 bytes) +Event: 216.231 Thread 0x0000016c5810ad60 nmethod 1026 0x0000016c6d19b688 code [0x0000016c6d19b9c0, 0x0000016c6d19dae0] +Event: 216.231 Thread 0x0000016c5810ad60 1027 3 java.util.concurrent.ForkJoinTask$Aux:: (15 bytes) +Event: 216.231 Thread 0x0000016c5810ad60 nmethod 1027 0x0000016c6d0ff888 code [0x0000016c6d0ff9a0, 0x0000016c6d0ffbd0] +Event: 225.242 Thread 0x0000016c58109860 1028 4 java.lang.AbstractStringBuilder::charAt (36 bytes) +Event: 225.263 Thread 0x0000016c58109860 nmethod 1028 0x0000016c74eed308 code [0x0000016c74eed400, 0x0000016c74eed540] +Event: 226.597 Thread 0x0000016c58109860 1029 % 4 java.util.concurrent.ForkJoinPool::helpComplete @ 153 (435 bytes) +Event: 227.034 Thread 0x0000016c58109860 nmethod 1029% 0x0000016c74e7f508 code [0x0000016c74e7fa40, 0x0000016c74e84a58] +Event: 249.559 Thread 0x0000016c5810ad60 1030 3 java.util.stream.AbstractPipeline::hasAnyStateful (38 bytes) +Event: 249.562 Thread 0x0000016c5810ad60 nmethod 1030 0x0000016c6d0ff288 code [0x0000016c6d0ff3c0, 0x0000016c6d0ff808] +Event: 250.842 Thread 0x0000016c58109860 1031 4 java.lang.StringLatin1::inflate (34 bytes) +Event: 250.909 Thread 0x0000016c58109860 nmethod 1031 0x0000016c74eecf88 code [0x0000016c74eed080, 0x0000016c74eed2c8] +Event: 253.782 Thread 0x0000016c58109860 1032 4 java.util.concurrent.ForkJoinPool::helpComplete (435 bytes) +Event: 254.221 Thread 0x0000016c58109860 nmethod 1032 0x0000016c74ef7908 code [0x0000016c74ef7da0, 0x0000016c74efd548] +Event: 258.421 Thread 0x0000016c5810ad60 1033 % 3 java.util.concurrent.ForkJoinPool::helpComplete @ 252 (435 bytes) +Event: 258.430 Thread 0x0000016c5810ad60 nmethod 1033% 0x0000016c6d19db88 code [0x0000016c6d19de20, 0x0000016c6d1a0168] +Event: 258.467 Thread 0x0000016c58109860 1034 4 java.lang.StringCoding::implEncodeAsciiArray (47 bytes) +Event: 258.496 Thread 0x0000016c58109860 nmethod 1034 0x0000016c74ed5108 code [0x0000016c74ed5200, 0x0000016c74ed54f0] + +GC Heap History (20 events): +Event: 251.790 GC heap after +{Heap after GC invocations=293 (full 0): + garbage-first heap total reserved 16662528K, committed 9887744K, used 5102489K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 8 young (65536K), 8 survivors (65536K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 252.414 GC heap before +{Heap before GC invocations=293 (full 0): + garbage-first heap total reserved 16662528K, committed 9887744K, used 5528473K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 60 young (491520K), 8 survivors (65536K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 252.611 GC heap after +{Heap after GC invocations=294 (full 0): + garbage-first heap total reserved 16662528K, committed 9887744K, used 5376112K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 8 young (65536K), 8 survivors (65536K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 253.031 GC heap before +{Heap before GC invocations=294 (full 0): + garbage-first heap total reserved 16662528K, committed 9887744K, used 5802096K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 60 young (491520K), 8 survivors (65536K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 253.256 GC heap after +{Heap after GC invocations=295 (full 0): + garbage-first heap total reserved 16662528K, committed 11714560K, used 5657356K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 8 young (65536K), 8 survivors (65536K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 253.828 GC heap before +{Heap before GC invocations=295 (full 0): + garbage-first heap total reserved 16662528K, committed 11714560K, used 6173452K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 71 young (581632K), 8 survivors (65536K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 254.079 GC heap after +{Heap after GC invocations=296 (full 0): + garbage-first heap total reserved 16662528K, committed 11714560K, used 5998704K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 9 survivors (73728K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 254.635 GC heap before +{Heap before GC invocations=296 (full 0): + garbage-first heap total reserved 16662528K, committed 11714560K, used 6506608K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 71 young (581632K), 9 survivors (73728K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 254.889 GC heap after +{Heap after GC invocations=297 (full 0): + garbage-first heap total reserved 16662528K, committed 11714560K, used 6327909K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 9 survivors (73728K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 255.422 GC heap before +{Heap before GC invocations=297 (full 0): + garbage-first heap total reserved 16662528K, committed 11714560K, used 6835813K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 71 young (581632K), 9 survivors (73728K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 255.693 GC heap after +{Heap after GC invocations=298 (full 0): + garbage-first heap total reserved 16662528K, committed 11714560K, used 6661935K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 9 survivors (73728K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 256.404 GC heap before +{Heap before GC invocations=298 (full 0): + garbage-first heap total reserved 16662528K, committed 11714560K, used 7169839K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 71 young (581632K), 9 survivors (73728K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 256.690 GC heap after +{Heap after GC invocations=299 (full 0): + garbage-first heap total reserved 16662528K, committed 13565952K, used 6994724K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 9 survivors (73728K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 257.788 GC heap before +{Heap before GC invocations=299 (full 0): + garbage-first heap total reserved 16662528K, committed 13565952K, used 7592740K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 82 young (671744K), 9 survivors (73728K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 258.127 GC heap after +{Heap after GC invocations=300 (full 0): + garbage-first heap total reserved 16662528K, committed 13565952K, used 7364983K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 11 young (90112K), 11 survivors (90112K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 259.075 GC heap before +{Heap before GC invocations=300 (full 0): + garbage-first heap total reserved 16662528K, committed 13565952K, used 7946615K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 82 young (671744K), 11 survivors (90112K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 259.387 GC heap after +{Heap after GC invocations=301 (full 0): + garbage-first heap total reserved 16662528K, committed 13565952K, used 7712514K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 11 young (90112K), 11 survivors (90112K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 260.195 GC heap before +{Heap before GC invocations=301 (full 0): + garbage-first heap total reserved 16662528K, committed 13565952K, used 8294146K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 82 young (671744K), 11 survivors (90112K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 260.413 GC heap after +{Heap after GC invocations=302 (full 0): + garbage-first heap total reserved 16662528K, committed 13565952K, used 8056576K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 11 young (90112K), 11 survivors (90112K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} +Event: 261.174 GC heap before +{Heap before GC invocations=302 (full 0): + garbage-first heap total reserved 16662528K, committed 13565952K, used 8638208K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 82 young (671744K), 11 survivors (90112K) + Metaspace used 1247K, committed 1408K, reserved 1114112K + class space used 58K, committed 128K, reserved 1048576K +} + +Dll operation events (4 events): +Event: 0.008 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\java.dll +Event: 0.058 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jsvml.dll +Event: 0.061 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jvmcicompiler.dll +Event: 0.167 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jimage.dll + +Deoptimization events (20 events): +Event: 171.128 Thread 0x0000016c583e1350 DEOPT PACKING pc=0x0000016c6d12fdf2 sp=0x0000000f601ff270 +Event: 171.128 Thread 0x0000016c583e1350 DEOPT UNPACKING pc=0x0000016c743749a3 sp=0x0000000f601fe750 mode 0 +Event: 180.638 Thread 0x0000016c583946f0 DEOPT PACKING pc=0x0000016c6d0ff9f2 sp=0x0000000f5efff130 +Event: 180.638 Thread 0x0000016c583946f0 DEOPT UNPACKING pc=0x0000016c743749a3 sp=0x0000000f5effe610 mode 0 +Event: 185.597 Thread 0x0000016c583dbe00 Uncommon trap: trap_request=0xffffffed fr.pc=0x0000016c74ed1d8f relative=0x000000000000a80f +Event: 185.597 Thread 0x0000016c583dbe00 Uncommon trap: reason=null_assert_or_unreached0 action=reinterpret pc=0x0000016c74ed1d8f method=java.util.concurrent.CountedCompleter.weakCompareAndSetPendingCount(II)Z @ 12 jvmci +Event: 185.597 Thread 0x0000016c583dbe00 DEOPT PACKING pc=0x0000016c74ed1d8f sp=0x0000000f5f8ff250 +Event: 185.597 Thread 0x0000016c583dbe00 DEOPT UNPACKING pc=0x0000016c743749a3 sp=0x0000000f5f8fe560 mode 3 +Event: 201.227 Thread 0x0000016c583e19e0 DEOPT PACKING pc=0x0000016c6d13c8f2 sp=0x0000000f607ff320 +Event: 201.227 Thread 0x0000016c583e19e0 DEOPT UNPACKING pc=0x0000016c743749a3 sp=0x0000000f607fe800 mode 0 +Event: 245.767 Thread 0x0000016c583e2700 Uncommon trap: trap_request=0xffffffed fr.pc=0x0000016c74ed124e relative=0x0000000000009cce +Event: 245.767 Thread 0x0000016c583e2700 Uncommon trap: reason=null_assert_or_unreached0 action=reinterpret pc=0x0000016c74ed124e method=java.util.concurrent.ForkJoinPool.runWorker(Ljava/util/concurrent/ForkJoinPool$WorkQueue;)V @ 128 jvmci +Event: 245.767 Thread 0x0000016c583e2700 DEOPT PACKING pc=0x0000016c74ed124e sp=0x0000000f621fee80 +Event: 245.767 Thread 0x0000016c583e2700 DEOPT UNPACKING pc=0x0000016c743749a3 sp=0x0000000f621fe480 mode 3 +Event: 253.782 Thread 0x0000016c60b2eec0 DEOPT PACKING pc=0x0000016c6d0d8a9d sp=0x0000000f5bbfef80 +Event: 253.782 Thread 0x0000016c60b2eec0 DEOPT UNPACKING pc=0x0000016c743749a3 sp=0x0000000f5bbfe440 mode 0 +Event: 254.540 Thread 0x0000016c60b2eec0 Uncommon trap: trap_request=0xffffffed fr.pc=0x0000016c74efc0d8 relative=0x0000000000004338 +Event: 254.541 Thread 0x0000016c60b2eec0 Uncommon trap: reason=null_assert_or_unreached0 action=reinterpret pc=0x0000016c74efc0d8 method=java.util.concurrent.ForkJoinPool.helpComplete(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinPool$WorkQueue;Z)I @ 293 jvmci +Event: 254.541 Thread 0x0000016c60b2eec0 DEOPT PACKING pc=0x0000016c74efc0d8 sp=0x0000000f5bbfef40 +Event: 254.541 Thread 0x0000016c60b2eec0 DEOPT UNPACKING pc=0x0000016c743749a3 sp=0x0000000f5bbfe438 mode 3 + +Classes loaded (20 events): +Event: 0.162 Loading class jdk/internal/module/ModulePatcher$PatchedModuleReader +Event: 0.162 Loading class jdk/internal/module/ModulePatcher$PatchedModuleReader done +Event: 0.169 Loading class sun/net/www/protocol/jrt/Handler +Event: 0.169 Loading class sun/net/www/protocol/jrt/Handler done +Event: 0.180 Loading class sun/util/resources/LocaleData$CommonResourceBundleProvider +Event: 0.180 Loading class sun/util/resources/LocaleData$LocaleDataResourceBundleProvider +Event: 0.180 Loading class java/util/spi/ResourceBundleProvider +Event: 0.181 Loading class java/util/spi/ResourceBundleProvider done +Event: 0.181 Loading class sun/util/resources/LocaleData$LocaleDataResourceBundleProvider done +Event: 0.181 Loading class sun/util/resources/LocaleData$CommonResourceBundleProvider done +Event: 0.182 Loading class sun/util/cldr/CLDRBaseLocaleDataMetaInfo$CLDRMapHolder +Event: 0.183 Loading class sun/util/cldr/CLDRBaseLocaleDataMetaInfo$CLDRMapHolder done +Event: 0.186 Loading class java/util/HashMap$EntrySpliterator +Event: 0.186 Loading class java/util/HashMap$EntrySpliterator done +Event: 0.191 Loading class sun/util/resources/Bundles$2 +Event: 0.191 Loading class sun/util/resources/Bundles$2 done +Event: 0.192 Loading class java/lang/InstantiationException +Event: 0.192 Loading class java/lang/InstantiationException done +Event: 0.192 Loading class java/lang/IllegalAccessException +Event: 0.192 Loading class java/lang/IllegalAccessException done + +Classes unloaded (0 events): +No events + +Classes redefined (0 events): +No events + +Internal exceptions (4 events): +Event: 0.127 Thread 0x0000016c60b2eec0 Exception (0x0000000446e9f428) +thrown [s\open\src\hotspot\share\interpreter\linkResolver.cpp, line 796] +Event: 0.187 Thread 0x0000016c60b2eec0 Exception (0x00000004469462c0) +thrown [s\open\src\hotspot\share\interpreter\linkResolver.cpp, line 796] +Event: 119.530 Thread 0x0000016c58363210 Implicit null exception at 0x0000016c74f34dc0 to 0x0000016c74f3aec8 +Event: 128.645 Thread 0x0000016c583946f0 Implicit null exception at 0x0000016c74ea7840 to 0x0000016c74ead3f9 + +VM Operations (20 events): +Event: 251.790 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 252.413 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 252.611 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 253.030 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 253.256 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 253.828 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 254.079 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 254.635 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 254.889 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 255.422 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 255.693 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 256.404 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 256.690 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 257.788 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 258.128 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 259.075 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 259.387 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 260.195 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 260.413 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 261.174 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) + +Memory protections (0 events): +No events + +Nmethod flushes (20 events): +Event: 56.478 Thread 0x0000016c7e80d430 flushing osr nmethod 0x0000016c6d142b08 +Event: 121.330 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d0c5a88 +Event: 121.330 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d139508 +Event: 121.330 Thread 0x0000016c7e80d430 flushing osr nmethod 0x0000016c74f48188 +Event: 121.330 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d0f7b88 +Event: 121.330 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d172208 +Event: 121.330 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c74e8af08 +Event: 121.330 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d149908 +Event: 154.582 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d0e4488 +Event: 183.826 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d0e4b08 +Event: 183.826 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d147408 +Event: 183.826 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d149388 +Event: 183.826 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d0bf208 +Event: 211.526 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d17e808 +Event: 211.526 Thread 0x0000016c7e80d430 flushing osr nmethod 0x0000016c6d15a388 +Event: 211.526 Thread 0x0000016c7e80d430 flushing nmethod 0x0000016c6d169108 +Event: 211.526 Thread 0x0000016c7e80d430 flushing osr nmethod 0x0000016c6d12e908 +Event: 211.526 Thread 0x0000016c7e80d430 flushing osr nmethod 0x0000016c6d172508 +Event: 211.526 Thread 0x0000016c7e80d430 flushing osr nmethod 0x0000016c6d0fe508 +Event: 241.599 Thread 0x0000016c7e80d430 flushing osr nmethod 0x0000016c6d13b408 + +Events (20 events): +Event: 153.463 Thread 0x0000016c5810ad60 Thread added: 0x0000016c5e2b9a40 +Event: 153.463 Thread 0x0000016c5810ad60 Thread added: 0x0000016c5df302f0 +Event: 153.463 Thread 0x0000016c5810ad60 Thread added: 0x0000016c589dd330 +Event: 153.463 Thread 0x0000016c5810ad60 Thread added: 0x0000016c5e1354d0 +Event: 153.463 Thread 0x0000016c5810ad60 Thread added: 0x0000016c5e1c5c20 +Event: 157.010 Thread 0x0000016c5e1c5c20 Thread exited: 0x0000016c5e1c5c20 +Event: 162.010 Thread 0x0000016c5e1354d0 Thread exited: 0x0000016c5e1354d0 +Event: 167.011 Thread 0x0000016c589dd330 Thread exited: 0x0000016c589dd330 +Event: 167.012 Thread 0x0000016c5df302f0 Thread exited: 0x0000016c5df302f0 +Event: 170.536 Thread 0x0000016c5e2b9a40 Thread exited: 0x0000016c5e2b9a40 +Event: 175.796 Thread 0x0000016c5e0bace0 Thread exited: 0x0000016c5e0bace0 +Event: 175.796 Thread 0x0000016c5e039d30 Thread exited: 0x0000016c5e039d30 +Event: 180.796 Thread 0x0000016c5e133d90 Thread exited: 0x0000016c5e133d90 +Event: 180.796 Thread 0x0000016c58a97a20 Thread exited: 0x0000016c58a97a20 +Event: 205.464 Thread 0x0000016c5810ad60 Thread added: 0x0000016c5e23ff10 +Event: 205.465 Thread 0x0000016c5810ad60 Thread added: 0x0000016c589dd330 +Event: 205.465 Thread 0x0000016c5810ad60 Thread added: 0x0000016c5deb4350 +Event: 210.599 Thread 0x0000016c5deb4350 Thread exited: 0x0000016c5deb4350 +Event: 210.766 Thread 0x0000016c589dd330 Thread exited: 0x0000016c589dd330 +Event: 215.116 Thread 0x0000016c5e23ff10 Thread exited: 0x0000016c5e23ff10 + + +Dynamic libraries: +0x00007ff63b640000 - 0x00007ff63b650000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\javaw.exe +0x00007fff302e0000 - 0x00007fff304e1000 C:\Windows\SYSTEM32\ntdll.dll +0x00007fff2ef90000 - 0x00007fff2f04e000 C:\Windows\System32\KERNEL32.DLL +0x00007fff2d9a0000 - 0x00007fff2dd0e000 C:\Windows\System32\KERNELBASE.dll +0x00007fff2df20000 - 0x00007fff2e030000 C:\Windows\System32\ucrtbase.dll +0x00007fff28040000 - 0x00007fff2805b000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\VCRUNTIME140.dll +0x00007fff28080000 - 0x00007fff28097000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jli.dll +0x00007fff2e9c0000 - 0x00007fff2eb65000 C:\Windows\System32\USER32.dll +0x00007fff13dd0000 - 0x00007fff14075000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.20348.1_none_88d3d41d702dedea\COMCTL32.dll +0x00007fff2ddd0000 - 0x00007fff2ddf6000 C:\Windows\System32\win32u.dll +0x00007fff2e3e0000 - 0x00007fff2e40b000 C:\Windows\System32\GDI32.dll +0x00007fff2f460000 - 0x00007fff2f503000 C:\Windows\System32\msvcrt.dll +0x00007fff2de00000 - 0x00007fff2df1a000 C:\Windows\System32\gdi32full.dll +0x00007fff2d900000 - 0x00007fff2d9a0000 C:\Windows\System32\msvcp_win.dll +0x00007fff2fe80000 - 0x00007fff2feb1000 C:\Windows\System32\IMM32.DLL +0x00007fff1a850000 - 0x00007fff1a85c000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\vcruntime140_1.dll +0x00007ffefd890000 - 0x00007ffefd91e000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\msvcp140.dll +0x00007ffdac1c0000 - 0x00007ffdacf0f000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\server\jvm.dll +0x00007fff2f3b0000 - 0x00007fff2f45e000 C:\Windows\System32\ADVAPI32.dll +0x00007fff2e920000 - 0x00007fff2e9bf000 C:\Windows\System32\sechost.dll +0x00007fff2fd50000 - 0x00007fff2fe6f000 C:\Windows\System32\RPCRT4.dll +0x00007fff2f0f0000 - 0x00007fff2f161000 C:\Windows\System32\WS2_32.dll +0x00007fff2d770000 - 0x00007fff2d7bd000 C:\Windows\SYSTEM32\POWRPROF.dll +0x00007fff26410000 - 0x00007fff26437000 C:\Windows\SYSTEM32\WINMM.dll +0x00007fff293d0000 - 0x00007fff293da000 C:\Windows\SYSTEM32\VERSION.dll +0x00007fff2d750000 - 0x00007fff2d763000 C:\Windows\SYSTEM32\UMPDC.dll +0x00007fff2c1f0000 - 0x00007fff2c207000 C:\Windows\SYSTEM32\kernel.appcore.dll +0x00007fff19fd0000 - 0x00007fff19fda000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jimage.dll +0x00007fff179e0000 - 0x00007fff17bf2000 C:\Windows\SYSTEM32\DBGHELP.DLL +0x00007fff16980000 - 0x00007fff169b0000 C:\Windows\SYSTEM32\dbgcore.DLL +0x00007fff2e030000 - 0x00007fff2e0ad000 C:\Windows\System32\bcryptPrimitives.dll +0x00007fff16340000 - 0x00007fff1635e000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\java.dll +0x00007fff2f170000 - 0x00007fff2f2a5000 C:\Windows\System32\ole32.dll +0x00007fff2ff20000 - 0x00007fff30291000 C:\Windows\System32\combase.dll +0x00007fff2f570000 - 0x00007fff2fcca000 C:\Windows\System32\SHELL32.dll +0x00007fff23550000 - 0x00007fff23d96000 C:\Windows\SYSTEM32\windows.storage.dll +0x00007fff2eea0000 - 0x00007fff2ef8a000 C:\Windows\System32\SHCORE.dll +0x00007fff2fcf0000 - 0x00007fff2fd4f000 C:\Windows\System32\shlwapi.dll +0x00007fff2d7c0000 - 0x00007fff2d7e1000 C:\Windows\SYSTEM32\profapi.dll +0x00007ffee94d0000 - 0x00007ffee95a7000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jsvml.dll +0x00007ffd377e0000 - 0x00007ffd3a408000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jvmcicompiler.dll +0x00007fff2f0e0000 - 0x00007fff2f0e8000 C:\Windows\System32\PSAPI.DLL +0x00007fff2e0b0000 - 0x00007fff2e210000 C:\Windows\System32\CRYPT32.dll +0x00007fff2ce60000 - 0x00007fff2ce8e000 C:\Windows\SYSTEM32\USERENV.dll +0x00007fff2d0d0000 - 0x00007fff2d0fe000 C:\Windows\SYSTEM32\ncrypt.dll +0x00007fff2caa0000 - 0x00007fff2cacd000 C:\Windows\SYSTEM32\IPHLPAPI.DLL +0x00007fff2cd60000 - 0x00007fff2cdc8000 C:\Windows\SYSTEM32\MSWSOCK.dll +0x00007fff2d090000 - 0x00007fff2d0c7000 C:\Windows\SYSTEM32\NTASN1.dll + +dbghelp: loaded successfully - version: 4.0.5 - missing functions: none +symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin;C:\Windows\SYSTEM32;C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.20348.1_none_88d3d41d702dedea;C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\server + +VM Arguments: +jvm_args: -XX:ThreadPriorityPolicy=1 -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCIProduct -XX:-UnlockExperimentalVMOptions --add-exports=java.base/jdk.internal.misc=jdk.graal.compiler -XX:+ShowCodeDetailsInExceptionMessages --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED --add-exports=java.base/jdk.internal.foreign=ALL-UNNAMED --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED --add-opens=java.base/jdk.internal.foreign=ALL-UNNAMED +java_command: org.kne.cloud.network.monitor.TimestampMonitor +java_class_path (initial): C:\KNEļ\coding\java\KLALB\bin;C:\KNEļ\coding\java\KNElib\bin;C:\KNEļ\coding\java\KLALB\lib\gson-2.1.jar;C:\KNEļ\coding\java\KLALB\lib\javassist.jar;C:\KNEļ\coding\java\KLALB\lib\ini4j.jar;C:\KNEļ\coding\java\KLALB\lib\JFreeChart1.5.2.jar;C:\KNEļ\coding\java\KLALB\lib\toml4j-0.7.1.jar;C:\KNEļ\coding\java\KLALB\lib\pcap4j-core-1.8.2.jar;C:\KNEļ\coding\java\KLALB\lib\pcap4j-packetfactory-propertiesbased-1.8.2.jar;C:\KNEļ\coding\java\KLALB\lib\pcap4j-packetfactory-static-1.8.2.jar;C:\KNEļ\coding\java\KLALB\lib\pcap4j-sample-1.8.2.jar;C:\KNEļ\coding\java\KLALB\lib\slf4j-api-2.0.9.jar;C:\KNEļ\coding\java\KLALB\lib\slf4j-api-2.0.9-javadoc.jar;C:\KNEļ\coding\java\KLALB\lib\slf4j-api-2.0.9-sources.jar;C:\KNEļ\coding\java\KLALB\lib\slf4j-api-2.0.9-tests.jar;C:\KNEļ\coding\java\KLALB\lib\disruptor-4.0.0.jar;C:\KNEļ\coding\java\KLALB\lib\disruptor-4.0.0-javadoc.jar;C:\KNEļ\coding\java\KLALB\lib\disruptor-4.0.0-sources.jar;C:\KNEļ\coding\java\KLALB\lib\JavaTUN.jar +Launcher Type: SUN_STANDARD + +[Global flags] + intx CICompilerCount = 15 {product} {ergonomic} + uint ConcGCThreads = 10 {product} {ergonomic} + bool EnableJVMCIProduct = true {JVMCI product} {jimage} + uint G1ConcRefinementThreads = 38 {product} {ergonomic} + size_t G1HeapRegionSize = 8388608 {product} {ergonomic} + size_t InitialHeapSize = 1073741824 {product} {ergonomic} + size_t MarkStackSize = 4194304 {product} {ergonomic} + size_t MarkStackSizeMax = 536870912 {product} {ergonomic} + size_t MaxHeapSize = 17062428672 {product} {ergonomic} + size_t MaxNewSize = 10234101760 {product} {ergonomic} + size_t MinHeapDeltaBytes = 8388608 {product} {ergonomic} + size_t MinHeapSize = 8388608 {product} {ergonomic} + uintx NonNMethodCodeHeapSize = 11599872 {pd product} {ergonomic} + uintx NonProfiledCodeHeapSize = 120061952 {pd product} {ergonomic} + uintx ProfiledCodeHeapSize = 119996416 {pd product} {ergonomic} + uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} + bool SegmentedCodeCache = true {product} {ergonomic} + bool ShowCodeDetailsInExceptionMessages = true {manageable} {command line} + size_t SoftMaxHeapSize = 17062428672 {manageable} {ergonomic} + int ThreadPriorityPolicy = 1 {product} {jimage} + bool UseCompressedOops = true {product lp64_product} {ergonomic} + bool UseG1GC = true {product} {ergonomic} + bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} + +Logging: +Log output configuration: + #0: stdout all=warning uptime,level,tags foldmultilines=false + #1: stderr all=off uptime,level,tags foldmultilines=false + +Environment Variables: +JAVA_HOME=C:\Program Files\Java\jdk-19 +PATH=C:/Program Files/Java/graalvm-ce-java19-22.3.1/bin/server;C:/Program Files/Java/graalvm-ce-java19-22.3.1/bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\libnvvp;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\libnvvp;C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Java\jdk-19\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\Bandizip\;C:\Program Files\Docker\Docker\resources\bin;C:\ProgramData\chocolatey\bin;C:\tools\Manim\Scripts;C:\Program Files\MiKTeX\miktex\bin\x64\;C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\dotnet\;C:\Program Files (x86)\NetSarang\Xftp 7\;C:\Program Files\010 Editor;C:\Program Files\nodejs\;C:\Program Files\Microsoft VS Code Insiders\bin;C:\Program Files\Disktrix\UltimateDefrag;C:\Program Files\Sunshine;C:\Program Files\Sunshine\tools;C:\Program Files\NVIDIA Corporation\Nsight Compute 2023.1.0\;C:\Users\Administrator\AppData\Local\Programs\Python\Python310\Scripts\;C:\Users\Administrator\AppData\Local\Programs\Python\Python310\;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\Users\Administrator\AppData\Roaming\npm;C:\Program Files\eclipse; +USERNAME=Administrator +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 85 Stepping 4, GenuineIntel +TMP=C:\Users\ADMINI~1\AppData\Local\Temp +TEMP=C:\Users\ADMINI~1\AppData\Local\Temp + + + + +Periodic native trim disabled + +--------------- S Y S T E M --------------- + +OS: + Windows Server 2022 , 64 bit Build 20348 (10.0.20348.1726) +OS uptime: 20 days 23:58 hours + +CPU: total 56 (initial active 56) (14 cores per cpu, 2 threads per core) family 6 model 85 stepping 4 microcode 0x2006b06, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, rtm, adx, fma, vzeroupper, clflush, clflushopt, clwb, rdtscp, f16c, pku +Processor Information for the first 56 processors : + Max Mhz: 2195, Current Mhz: 2195, Mhz Limit: 2195 + +Memory: 4k page, system-wide physical 65072M (9750M free) +TotalPageFile size 97840M (AvailPageFile size 449M) +current process WorkingSet (physical memory assigned to process): 8899M, peak: 15280M +current process commit charge ("private bytes"): 13739M, peak: 16500M + +vm_info: Java HotSpot(TM) 64-Bit Server VM (23.0.1+11-jvmci-b01) for windows-amd64 JRE (23.0.1+11-jvmci-b01), built on 2024-10-01T10:34:46Z with MS VC++ 17.6 (VS2022) + +END. diff --git a/hs_err_pid28220.mdmp b/hs_err_pid28220.mdmp new file mode 100644 index 0000000..e69de29 diff --git a/hs_err_pid29580.log b/hs_err_pid29580.log new file mode 100644 index 0000000..1fdc7ac --- /dev/null +++ b/hs_err_pid29580.log @@ -0,0 +1,2180 @@ +# +# There is insufficient memory for the Java Runtime Environment to continue. +# Native memory allocation (mmap) failed to map 1342177280 bytes. Error detail: G1 virtual space +# Possible reasons: +# The system is out of physical RAM or swap space +# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap +# Possible solutions: +# Reduce memory load on the system +# Increase physical memory or swap space +# Check if swap backing store is full +# Decrease Java heap size (-Xmx/-Xms) +# Decrease number of Java threads +# Decrease Java thread stack sizes (-Xss) +# Set larger code cache with -XX:ReservedCodeCacheSize= +# JVM is running with Zero Based Compressed Oops mode in which the Java heap is +# placed in the first 32GB address space. The Java Heap base address is the +# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress +# to set the Java Heap base and to place the Java Heap above 32GB virtual address. +# This output file may be truncated or incomplete. +# +# Out of Memory Error (os_windows.cpp:3703), pid=29580, tid=72900 +# +# JRE version: Java(TM) SE Runtime Environment Oracle GraalVM 23.0.1+11.1 (23.0.1+11) (build 23.0.1+11-jvmci-b01) +# Java VM: Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 23.0.1+11.1 (23.0.1+11-jvmci-b01, mixed mode, sharing, tiered, jvmci, jvmci compiler, compressed oops, compressed class ptrs, g1 gc, windows-amd64) +# Core dump will be written. Default location: C:\KNEļ\coding\java\KLALB\hs_err_pid29580.mdmp +# + +--------------- S U M M A R Y ------------ + +Command Line: -XX:ThreadPriorityPolicy=1 -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCIProduct -XX:-UnlockExperimentalVMOptions --add-exports=java.base/jdk.internal.misc=jdk.graal.compiler -XX:+ShowCodeDetailsInExceptionMessages -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:41761 -javaagent:C:\Program Files\eclipse\configuration\org.eclipse.osgi\837\0\.cp\lib\javaagent-shaded.jar --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED --add-exports=java.base/jdk.internal.foreign=ALL-UNNAMED --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED --add-opens=java.base/jdk.internal.foreign=ALL-UNNAMED org.kne.cloud.network.monitor.TimestampMonitor + +Host: Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz, 56 cores, 63G, Windows Server 2022 , 64 bit Build 20348 (10.0.20348.1726) +Time: Wed Oct 29 17:48:51 2025 Windows Server 2022 , 64 bit Build 20348 (10.0.20348.1726) elapsed time: 22.587800 seconds (0d 0h 0m 22s) + +--------------- T H R E A D --------------- + +Current thread (0x000001b9cb596120): VMThread "VM Thread" [id=72900, stack(0x000000b5df600000,0x000000b5df700000) (1024K)] + +Stack: [0x000000b5df600000,0x000000b5df700000] +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +V [jvm.dll+0x6e08b9] (no source info available) +V [jvm.dll+0x87dc83] (no source info available) +V [jvm.dll+0x88010e] (no source info available) +V [jvm.dll+0x8807e3] (no source info available) +V [jvm.dll+0x27aee6] (no source info available) +V [jvm.dll+0x6dd1c5] (no source info available) +V [jvm.dll+0x6d104a] (no source info available) +V [jvm.dll+0x35b3ea] (no source info available) +V [jvm.dll+0x3637f6] (no source info available) +V [jvm.dll+0x34fd5e] (no source info available) +V [jvm.dll+0x34fff8] (no source info available) +V [jvm.dll+0x3289cc] (no source info available) +V [jvm.dll+0x328a5a] (no source info available) +V [jvm.dll+0x374c92] (no source info available) +V [jvm.dll+0x373392] (no source info available) +V [jvm.dll+0x3281a7] (no source info available) +V [jvm.dll+0x372b44] (no source info available) +V [jvm.dll+0x886720] (no source info available) +V [jvm.dll+0x887a47] (no source info available) +V [jvm.dll+0x887f78] (no source info available) +V [jvm.dll+0x888213] (no source info available) +V [jvm.dll+0x824f8b] (no source info available) +V [jvm.dll+0x6df065] (no source info available) +C [ucrtbase.dll+0x26b4c] (no source info available) +C [KERNEL32.DLL+0x14de0] (no source info available) +C [ntdll.dll+0x7e3db] (no source info available) + +VM_Operation (0x000000b5e09ff010): G1CollectForAllocation, mode: safepoint, requested by thread 0x000001ba1197c280 + + +--------------- P R O C E S S --------------- + +Threads class SMR info: +_java_thread_list=0x000001ba111c0230, length=72, elements={ +0x000001b99bf22130, 0x000001ba110f1fa0, 0x000001ba110f2cc0, 0x000001ba110f4250, +0x000001ba110f4f70, 0x000001ba110feb20, 0x000001ba110ff6b0, 0x000001ba11105a80, +0x000001ba11106660, 0x000001ba1122a150, 0x000001ba11350750, 0x000001ba11353630, +0x000001ba11353cc0, 0x000001ba119727a0, 0x000001ba1197c280, 0x000001ba11f36060, +0x000001ba11f3a6e0, 0x000001ba11f3b160, 0x000001ba11f3b7d0, 0x000001ba11f3c250, +0x000001ba11f3e8d0, 0x000001ba1600bc10, 0x000001ba160144f0, 0x000001ba16015f30, +0x000001ba160172e0, 0x000001ba160158a0, 0x000001ba160165c0, 0x000001ba16016c50, +0x000001ba16017970, 0x000001ba16014b80, 0x000001ba16015210, 0x000001ba16033910, +0x000001ba16036070, 0x000001ba16031840, 0x000001ba16037420, 0x000001ba16037ab0, +0x000001ba16038140, 0x000001ba16033fa0, 0x000001ba16034630, 0x000001ba16034cc0, +0x000001ba160387d0, 0x000001ba16035350, 0x000001ba160359e0, 0x000001ba16032bf0, +0x000001ba16036700, 0x000001ba16036d90, 0x000001ba16038e60, 0x000001ba16032560, +0x000001ba16031ed0, 0x000001ba16033280, 0x000001ba1605b500, 0x000001ba1605c220, +0x000001ba16055920, 0x000001ba16056640, 0x000001ba16057360, 0x000001ba1605c8b0, +0x000001ba16059ac0, 0x000001ba16058080, 0x000001ba1605a150, 0x000001ba160579f0, +0x000001ba16058710, 0x000001ba16058da0, 0x000001ba16055fb0, 0x000001ba1605cf40, +0x000001ba1605bb90, 0x000001ba16059430, 0x000001ba16056cd0, 0x000001ba1605a7e0, +0x000001ba1605ae70, 0x000001ba1609f9b0, 0x000001ba112526c0, 0x000001ba160bc010 +} + +Java Threads: ( => current thread ) + 0x000001b99bf22130 JavaThread "main" [_thread_blocked, id=54460, stack(0x000000b5def00000,0x000000b5df000000) (1024K)] + 0x000001ba110f1fa0 JavaThread "Reference Handler" daemon [_thread_blocked, id=57340, stack(0x000000b5df700000,0x000000b5df800000) (1024K)] + 0x000001ba110f2cc0 JavaThread "Finalizer" daemon [_thread_blocked, id=55428, stack(0x000000b5df800000,0x000000b5df900000) (1024K)] + 0x000001ba110f4250 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=75132, stack(0x000000b5df900000,0x000000b5dfa00000) (1024K)] + 0x000001ba110f4f70 JavaThread "Attach Listener" daemon [_thread_blocked, id=63796, stack(0x000000b5dfa00000,0x000000b5dfb00000) (1024K)] + 0x000001ba110feb20 JavaThread "Service Thread" daemon [_thread_blocked, id=24004, stack(0x000000b5dfb00000,0x000000b5dfc00000) (1024K)] + 0x000001ba110ff6b0 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=30432, stack(0x000000b5dfc00000,0x000000b5dfd00000) (1024K)] + 0x000001ba11105a80 JavaThread "JVMCI-native CompilerThread0" daemon [_thread_blocked, id=87956, stack(0x000000b5dfd00000,0x000000b5dfe00000) (1024K)] + 0x000001ba11106660 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=83916, stack(0x000000b5dfe00000,0x000000b5dff00000) (1024K)] + 0x000001ba1122a150 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=76620, stack(0x000000b5dff00000,0x000000b5e0000000) (1024K)] + 0x000001ba11350750 JavaThread "JDWP Transport Listener: dt_socket" daemon [_thread_blocked, id=80668, stack(0x000000b5e0400000,0x000000b5e0500000) (1024K)] + 0x000001ba11353630 JavaThread "JDWP Event Helper Thread" daemon [_thread_blocked, id=21180, stack(0x000000b5e0500000,0x000000b5e0600000) (1024K)] + 0x000001ba11353cc0 JavaThread "JDWP Command Reader" daemon [_thread_blocked, id=47664, stack(0x000000b5e0600000,0x000000b5e0700000) (1024K)] + 0x000001ba119727a0 JavaThread "Notification Thread" daemon [_thread_blocked, id=43352, stack(0x000000b5e0800000,0x000000b5e0900000) (1024K)] + 0x000001ba1197c280 JavaThread "Thread-0" [_thread_blocked, id=64216, stack(0x000000b5e0900000,0x000000b5e0a00000) (1024K)] + 0x000001ba11f36060 JavaThread "ForkJoinPool.commonPool-worker-1" daemon [_thread_blocked, id=93584, stack(0x000000b5e2d00000,0x000000b5e2e00000) (1024K)] + 0x000001ba11f3a6e0 JavaThread "ForkJoinPool.commonPool-worker-3" daemon [_thread_blocked, id=67764, stack(0x000000b5e2e00000,0x000000b5e2f00000) (1024K)] + 0x000001ba11f3b160 JavaThread "ForkJoinPool.commonPool-worker-2" daemon [_thread_blocked, id=81516, stack(0x000000b5e2f00000,0x000000b5e3000000) (1024K)] + 0x000001ba11f3b7d0 JavaThread "ForkJoinPool.commonPool-worker-4" daemon [_thread_blocked, id=70716, stack(0x000000b5e3000000,0x000000b5e3100000) (1024K)] + 0x000001ba11f3c250 JavaThread "ForkJoinPool.commonPool-worker-5" daemon [_thread_blocked, id=27588, stack(0x000000b5e3100000,0x000000b5e3200000) (1024K)] + 0x000001ba11f3e8d0 JavaThread "ForkJoinPool.commonPool-worker-8" daemon [_thread_blocked, id=61168, stack(0x000000b5e3200000,0x000000b5e3300000) (1024K)] + 0x000001ba1600bc10 JavaThread "ForkJoinPool.commonPool-worker-11" daemon [_thread_blocked, id=58356, stack(0x000000b5e3300000,0x000000b5e3400000) (1024K)] + 0x000001ba160144f0 JavaThread "ForkJoinPool.commonPool-worker-9" daemon [_thread_blocked, id=71064, stack(0x000000b5e3400000,0x000000b5e3500000) (1024K)] + 0x000001ba16015f30 JavaThread "ForkJoinPool.commonPool-worker-13" daemon [_thread_blocked, id=43464, stack(0x000000b5e3500000,0x000000b5e3600000) (1024K)] + 0x000001ba160172e0 JavaThread "ForkJoinPool.commonPool-worker-7" daemon [_thread_blocked, id=28884, stack(0x000000b5e3600000,0x000000b5e3700000) (1024K)] + 0x000001ba160158a0 JavaThread "ForkJoinPool.commonPool-worker-12" daemon [_thread_blocked, id=49888, stack(0x000000b5e3700000,0x000000b5e3800000) (1024K)] + 0x000001ba160165c0 JavaThread "ForkJoinPool.commonPool-worker-18" daemon [_thread_blocked, id=37780, stack(0x000000b5e3800000,0x000000b5e3900000) (1024K)] + 0x000001ba16016c50 JavaThread "ForkJoinPool.commonPool-worker-10" daemon [_thread_blocked, id=53716, stack(0x000000b5e3900000,0x000000b5e3a00000) (1024K)] + 0x000001ba16017970 JavaThread "ForkJoinPool.commonPool-worker-15" daemon [_thread_blocked, id=76068, stack(0x000000b5e3a00000,0x000000b5e3b00000) (1024K)] + 0x000001ba16014b80 JavaThread "ForkJoinPool.commonPool-worker-24" daemon [_thread_blocked, id=93268, stack(0x000000b5e3b00000,0x000000b5e3c00000) (1024K)] + 0x000001ba16015210 JavaThread "ForkJoinPool.commonPool-worker-16" daemon [_thread_blocked, id=68488, stack(0x000000b5e3c00000,0x000000b5e3d00000) (1024K)] + 0x000001ba16033910 JavaThread "ForkJoinPool.commonPool-worker-29" daemon [_thread_blocked, id=49852, stack(0x000000b5e3d00000,0x000000b5e3e00000) (1024K)] + 0x000001ba16036070 JavaThread "ForkJoinPool.commonPool-worker-31" daemon [_thread_blocked, id=27388, stack(0x000000b5e3e00000,0x000000b5e3f00000) (1024K)] + 0x000001ba16031840 JavaThread "ForkJoinPool.commonPool-worker-19" daemon [_thread_blocked, id=48988, stack(0x000000b5e3f00000,0x000000b5e4000000) (1024K)] + 0x000001ba16037420 JavaThread "ForkJoinPool.commonPool-worker-20" daemon [_thread_blocked, id=57904, stack(0x000000b5e4000000,0x000000b5e4100000) (1024K)] + 0x000001ba16037ab0 JavaThread "ForkJoinPool.commonPool-worker-36" daemon [_thread_blocked, id=52000, stack(0x000000b5e4100000,0x000000b5e4200000) (1024K)] + 0x000001ba16038140 JavaThread "ForkJoinPool.commonPool-worker-22" daemon [_thread_blocked, id=29656, stack(0x000000b5e4200000,0x000000b5e4300000) (1024K)] + 0x000001ba16033fa0 JavaThread "ForkJoinPool.commonPool-worker-23" daemon [_thread_blocked, id=41672, stack(0x000000b5e4300000,0x000000b5e4400000) (1024K)] + 0x000001ba16034630 JavaThread "ForkJoinPool.commonPool-worker-25" daemon [_thread_blocked, id=4056, stack(0x000000b5e4400000,0x000000b5e4500000) (1024K)] + 0x000001ba16034cc0 JavaThread "ForkJoinPool.commonPool-worker-14" daemon [_thread_blocked, id=14124, stack(0x000000b5e4500000,0x000000b5e4600000) (1024K)] + 0x000001ba160387d0 JavaThread "ForkJoinPool.commonPool-worker-26" daemon [_thread_blocked, id=40516, stack(0x000000b5e4600000,0x000000b5e4700000) (1024K)] + 0x000001ba16035350 JavaThread "ForkJoinPool.commonPool-worker-27" daemon [_thread_blocked, id=57308, stack(0x000000b5e4700000,0x000000b5e4800000) (1024K)] + 0x000001ba160359e0 JavaThread "ForkJoinPool.commonPool-worker-28" daemon [_thread_blocked, id=83024, stack(0x000000b5e4800000,0x000000b5e4900000) (1024K)] + 0x000001ba16032bf0 JavaThread "ForkJoinPool.commonPool-worker-17" daemon [_thread_blocked, id=49064, stack(0x000000b5e4900000,0x000000b5e4a00000) (1024K)] + 0x000001ba16036700 JavaThread "ForkJoinPool.commonPool-worker-50" daemon [_thread_blocked, id=31912, stack(0x000000b5e4a00000,0x000000b5e4b00000) (1024K)] + 0x000001ba16036d90 JavaThread "ForkJoinPool.commonPool-worker-30" daemon [_thread_blocked, id=60264, stack(0x000000b5e4b00000,0x000000b5e4c00000) (1024K)] + 0x000001ba16038e60 JavaThread "ForkJoinPool.commonPool-worker-6" daemon [_thread_blocked, id=48304, stack(0x000000b5e4d00000,0x000000b5e4e00000) (1024K)] + 0x000001ba16032560 JavaThread "ForkJoinPool.commonPool-worker-32" daemon [_thread_blocked, id=44312, stack(0x000000b5e4e00000,0x000000b5e4f00000) (1024K)] + 0x000001ba16031ed0 JavaThread "ForkJoinPool.commonPool-worker-33" daemon [_thread_blocked, id=79240, stack(0x000000b5e4f00000,0x000000b5e5000000) (1024K)] + 0x000001ba16033280 JavaThread "ForkJoinPool.commonPool-worker-34" daemon [_thread_blocked, id=29476, stack(0x000000b5e5000000,0x000000b5e5100000) (1024K)] + 0x000001ba1605b500 JavaThread "ForkJoinPool.commonPool-worker-35" daemon [_thread_blocked, id=78008, stack(0x000000b5e5100000,0x000000b5e5200000) (1024K)] + 0x000001ba1605c220 JavaThread "ForkJoinPool.commonPool-worker-21" daemon [_thread_blocked, id=52228, stack(0x000000b5e5200000,0x000000b5e5300000) (1024K)] + 0x000001ba16055920 JavaThread "ForkJoinPool.commonPool-worker-38" daemon [_thread_blocked, id=93044, stack(0x000000b5e5300000,0x000000b5e5400000) (1024K)] + 0x000001ba16056640 JavaThread "ForkJoinPool.commonPool-worker-37" daemon [_thread_blocked, id=54944, stack(0x000000b5e5400000,0x000000b5e5500000) (1024K)] + 0x000001ba16057360 JavaThread "ForkJoinPool.commonPool-worker-39" daemon [_thread_blocked, id=63812, stack(0x000000b5e5500000,0x000000b5e5600000) (1024K)] + 0x000001ba1605c8b0 JavaThread "ForkJoinPool.commonPool-worker-40" daemon [_thread_blocked, id=63748, stack(0x000000b5e5600000,0x000000b5e5700000) (1024K)] + 0x000001ba16059ac0 JavaThread "ForkJoinPool.commonPool-worker-42" daemon [_thread_blocked, id=8784, stack(0x000000b5e5700000,0x000000b5e5800000) (1024K)] + 0x000001ba16058080 JavaThread "ForkJoinPool.commonPool-worker-41" daemon [_thread_blocked, id=36868, stack(0x000000b5e5800000,0x000000b5e5900000) (1024K)] + 0x000001ba1605a150 JavaThread "ForkJoinPool.commonPool-worker-44" daemon [_thread_blocked, id=84036, stack(0x000000b5e5900000,0x000000b5e5a00000) (1024K)] + 0x000001ba160579f0 JavaThread "ForkJoinPool.commonPool-worker-43" daemon [_thread_blocked, id=80660, stack(0x000000b5e5a00000,0x000000b5e5b00000) (1024K)] + 0x000001ba16058710 JavaThread "ForkJoinPool.commonPool-worker-45" daemon [_thread_blocked, id=91912, stack(0x000000b5e5b00000,0x000000b5e5c00000) (1024K)] + 0x000001ba16058da0 JavaThread "ForkJoinPool.commonPool-worker-46" daemon [_thread_blocked, id=29188, stack(0x000000b5e5c00000,0x000000b5e5d00000) (1024K)] + 0x000001ba16055fb0 JavaThread "ForkJoinPool.commonPool-worker-47" daemon [_thread_blocked, id=93952, stack(0x000000b5e5d00000,0x000000b5e5e00000) (1024K)] + 0x000001ba1605cf40 JavaThread "ForkJoinPool.commonPool-worker-48" daemon [_thread_blocked, id=50208, stack(0x000000b5e5e00000,0x000000b5e5f00000) (1024K)] + 0x000001ba1605bb90 JavaThread "ForkJoinPool.commonPool-worker-49" daemon [_thread_blocked, id=44072, stack(0x000000b5e5f00000,0x000000b5e6000000) (1024K)] + 0x000001ba16059430 JavaThread "ForkJoinPool.commonPool-worker-51" daemon [_thread_blocked, id=77024, stack(0x000000b5e6000000,0x000000b5e6100000) (1024K)] + 0x000001ba16056cd0 JavaThread "ForkJoinPool.commonPool-worker-52" daemon [_thread_blocked, id=52496, stack(0x000000b5e6100000,0x000000b5e6200000) (1024K)] + 0x000001ba1605a7e0 JavaThread "ForkJoinPool.commonPool-worker-53" daemon [_thread_blocked, id=82056, stack(0x000000b5e0100000,0x000000b5e0200000) (1024K)] + 0x000001ba1605ae70 JavaThread "ForkJoinPool.commonPool-worker-54" daemon [_thread_blocked, id=86192, stack(0x000000b5e0300000,0x000000b5e0400000) (1024K)] + 0x000001ba1609f9b0 JavaThread "ForkJoinPool.commonPool-worker-55" daemon [_thread_blocked, id=54852, stack(0x000000b5e6200000,0x000000b5e6300000) (1024K)] + 0x000001ba112526c0 JavaThread "JVMCI-native CompilerThread1" daemon [_thread_blocked, id=64944, stack(0x000000b5e0000000,0x000000b5e0100000) (1024K)] + 0x000001ba160bc010 JavaThread "JVMCI-native CompilerThread2" daemon [_thread_blocked, id=56356, stack(0x000000b5e4c00000,0x000000b5e4d00000) (1024K)] +Total: 72 + +Other Threads: +=>0x000001b9cb596120 VMThread "VM Thread" [id=72900, stack(0x000000b5df600000,0x000000b5df700000) (1024K)] + 0x000001b99bf189a0 WatcherThread "VM Periodic Task Thread" [id=52004, stack(0x000000b5df500000,0x000000b5df600000) (1024K)] + 0x000001b99bfd6690 WorkerThread "GC Thread#0" [id=31736, stack(0x000000b5df000000,0x000000b5df100000) (1024K)] + 0x000001ba119b5f30 WorkerThread "GC Thread#1" [id=67008, stack(0x000000b5e0b00000,0x000000b5e0c00000) (1024K)] + 0x000001ba119b62e0 WorkerThread "GC Thread#2" [id=62460, stack(0x000000b5e0c00000,0x000000b5e0d00000) (1024K)] + 0x000001ba119b6690 WorkerThread "GC Thread#3" [id=20660, stack(0x000000b5e0d00000,0x000000b5e0e00000) (1024K)] + 0x000001ba119bceb0 WorkerThread "GC Thread#4" [id=31448, stack(0x000000b5e0e00000,0x000000b5e0f00000) (1024K)] + 0x000001ba119d8740 WorkerThread "GC Thread#5" [id=64096, stack(0x000000b5e0f00000,0x000000b5e1000000) (1024K)] + 0x000001ba119d7fe0 WorkerThread "GC Thread#6" [id=88240, stack(0x000000b5e1000000,0x000000b5e1100000) (1024K)] + 0x000001ba119d6d70 WorkerThread "GC Thread#7" [id=71768, stack(0x000000b5e1100000,0x000000b5e1200000) (1024K)] + 0x000001ba119d74d0 WorkerThread "GC Thread#8" [id=84400, stack(0x000000b5e1200000,0x000000b5e1300000) (1024K)] + 0x000001ba119d7120 WorkerThread "GC Thread#9" [id=75452, stack(0x000000b5e1300000,0x000000b5e1400000) (1024K)] + 0x000001ba119d7880 WorkerThread "GC Thread#10" [id=47684, stack(0x000000b5e1400000,0x000000b5e1500000) (1024K)] + 0x000001ba119d7c30 WorkerThread "GC Thread#11" [id=28796, stack(0x000000b5e1500000,0x000000b5e1600000) (1024K)] + 0x000001ba119d8390 WorkerThread "GC Thread#12" [id=90812, stack(0x000000b5e1600000,0x000000b5e1700000) (1024K)] + 0x000001ba119e3d90 WorkerThread "GC Thread#13" [id=42776, stack(0x000000b5e1700000,0x000000b5e1800000) (1024K)] + 0x000001ba119e4140 WorkerThread "GC Thread#14" [id=51832, stack(0x000000b5e1800000,0x000000b5e1900000) (1024K)] + 0x000001ba119e39e0 WorkerThread "GC Thread#15" [id=78080, stack(0x000000b5e1900000,0x000000b5e1a00000) (1024K)] + 0x000001ba119e1500 WorkerThread "GC Thread#16" [id=50816, stack(0x000000b5e1a00000,0x000000b5e1b00000) (1024K)] + 0x000001ba119e18b0 WorkerThread "GC Thread#17" [id=66652, stack(0x000000b5e1b00000,0x000000b5e1c00000) (1024K)] + 0x000001ba119e2770 WorkerThread "GC Thread#18" [id=77744, stack(0x000000b5e1c00000,0x000000b5e1d00000) (1024K)] + 0x000001ba119e3630 WorkerThread "GC Thread#19" [id=42524, stack(0x000000b5e1d00000,0x000000b5e1e00000) (1024K)] + 0x000001ba119e2b20 WorkerThread "GC Thread#20" [id=60636, stack(0x000000b5e1e00000,0x000000b5e1f00000) (1024K)] + 0x000001ba119e1c60 WorkerThread "GC Thread#21" [id=68456, stack(0x000000b5e1f00000,0x000000b5e2000000) (1024K)] + 0x000001ba119e1150 WorkerThread "GC Thread#22" [id=90020, stack(0x000000b5e2000000,0x000000b5e2100000) (1024K)] + 0x000001ba119e0da0 WorkerThread "GC Thread#23" [id=22764, stack(0x000000b5e2100000,0x000000b5e2200000) (1024K)] + 0x000001ba119e2010 WorkerThread "GC Thread#24" [id=54612, stack(0x000000b5e0200000,0x000000b5e0300000) (1024K)] + 0x000001ba119e23c0 WorkerThread "GC Thread#25" [id=32028, stack(0x000000b5e0700000,0x000000b5e0800000) (1024K)] + 0x000001ba119e2ed0 WorkerThread "GC Thread#26" [id=56052, stack(0x000000b5e0a00000,0x000000b5e0b00000) (1024K)] + 0x000001ba119e3280 WorkerThread "GC Thread#27" [id=79376, stack(0x000000b5e2200000,0x000000b5e2300000) (1024K)] + 0x000001ba119e44f0 WorkerThread "GC Thread#28" [id=5004, stack(0x000000b5e2300000,0x000000b5e2400000) (1024K)] + 0x000001ba119e48a0 WorkerThread "GC Thread#29" [id=50656, stack(0x000000b5e2400000,0x000000b5e2500000) (1024K)] + 0x000001ba11c10620 WorkerThread "GC Thread#30" [id=70244, stack(0x000000b5e2500000,0x000000b5e2600000) (1024K)] + 0x000001ba11c11130 WorkerThread "GC Thread#31" [id=24704, stack(0x000000b5e2600000,0x000000b5e2700000) (1024K)] + 0x000001ba11c10270 WorkerThread "GC Thread#32" [id=56124, stack(0x000000b5e2700000,0x000000b5e2800000) (1024K)] + 0x000001ba11c0e140 WorkerThread "GC Thread#33" [id=90212, stack(0x000000b5e2800000,0x000000b5e2900000) (1024K)] + 0x000001ba11c109d0 WorkerThread "GC Thread#34" [id=62832, stack(0x000000b5e2900000,0x000000b5e2a00000) (1024K)] + 0x000001ba11c114e0 WorkerThread "GC Thread#35" [id=53896, stack(0x000000b5e2a00000,0x000000b5e2b00000) (1024K)] + 0x000001ba11c10d80 WorkerThread "GC Thread#36" [id=61916, stack(0x000000b5e2b00000,0x000000b5e2c00000) (1024K)] + 0x000001ba11c11890 WorkerThread "GC Thread#37" [id=42708, stack(0x000000b5e2c00000,0x000000b5e2d00000) (1024K)] + 0x000001b9cb422010 ConcurrentGCThread "G1 Main Marker" [id=43824, stack(0x000000b5df100000,0x000000b5df200000) (1024K)] + 0x000001b9cb422a20 WorkerThread "G1 Conc#0" [id=78376, stack(0x000000b5df200000,0x000000b5df300000) (1024K)] + 0x000001b9cb522360 ConcurrentGCThread "G1 Refine#0" [id=84900, stack(0x000000b5df300000,0x000000b5df400000) (1024K)] + 0x000001ba162426a0 ConcurrentGCThread "G1 Refine#1" [id=33244, stack(0x000000b5e6700000,0x000000b5e6800000) (1024K)] + 0x000001ba162764f0 ConcurrentGCThread "G1 Refine#2" [id=7712, stack(0x000000b5e6800000,0x000000b5e6900000) (1024K)] + 0x000001b9cb522de0 ConcurrentGCThread "G1 Service" [id=70900, stack(0x000000b5df400000,0x000000b5df500000) (1024K)] +Total: 46 + +Threads with active compile tasks: +Total: 0 + +VM state: at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) +[0x00007ffdace33910] Threads_lock - owner thread: 0x000001b9cb596120 +[0x00007ffdace33a10] Heap_lock - owner thread: 0x000001ba1197c280 + +Heap address: 0x0000000407000000, size: 16272 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 + +CDS archive(s) mapped at: [0x000001b9d0000000-0x000001b9d0d80000-0x000001b9d0d80000), size 14155776, SharedBaseAddress: 0x000001b9d0000000, ArchiveRelocationMode: 1. +Compressed class space mapped at: 0x000001b9d1000000-0x000001ba11000000, reserved size: 1073741824 +Narrow klass base: 0x000001b9d0000000, Narrow klass shift: 0, Narrow klass range: 0x41000000 + +GC Precious Log: + CardTable entry size: 512 + Card Set container configuration: InlinePtr #cards 4 size 8 Array Of Cards #cards 64 size 144 Howl #buckets 8 coarsen threshold 14745 Howl Bitmap #cards 2048 size 272 coarsen threshold 1843 Card regions per heap region 1 cards per card region 16384 + CPUs: 56 total, 56 available + Memory: 65072M + Large Page Support: Disabled + NUMA Support: Disabled + Compressed Oops: Enabled (Zero based) + Heap Region Size: 8M + Heap Min Capacity: 8M + Heap Initial Capacity: 1G + Heap Max Capacity: 16272M + Pre-touch: Disabled + Parallel Workers: 38 + Concurrent Workers: 10 + Concurrent Refinement Workers: 38 + Periodic GC: Disabled + +Heap: + garbage-first heap total reserved 16662528K, committed 11599872K, used 4341461K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 9 survivors (73728K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K + +Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, TAMS=top-at-mark-start, PB=parsable bottom +| 0|0x0000000407000000, 0x0000000407800000, 0x0000000407800000|100%| O| |TAMS 0x0000000407000000| PB 0x0000000407000000| Untracked | 0 +| 1|0x0000000407800000, 0x0000000408000000, 0x0000000408000000|100%| O| |TAMS 0x0000000407800000| PB 0x0000000407800000| Untracked | 0 +| 2|0x0000000408000000, 0x0000000408800000, 0x0000000408800000|100%| O| |TAMS 0x0000000408000000| PB 0x0000000408000000| Untracked | 0 +| 3|0x0000000408800000, 0x0000000409000000, 0x0000000409000000|100%| O| |TAMS 0x0000000408800000| PB 0x0000000408800000| Untracked | 0 +| 4|0x0000000409000000, 0x0000000409800000, 0x0000000409800000|100%| O| |TAMS 0x0000000409000000| PB 0x0000000409000000| Untracked | 0 +| 5|0x0000000409800000, 0x000000040a000000, 0x000000040a000000|100%| O| |TAMS 0x0000000409800000| PB 0x0000000409800000| Untracked | 0 +| 6|0x000000040a000000, 0x000000040a800000, 0x000000040a800000|100%|HS| |TAMS 0x000000040a000000| PB 0x000000040a000000| Complete | 0 +| 7|0x000000040a800000, 0x000000040b000000, 0x000000040b000000|100%| O| |TAMS 0x000000040a800000| PB 0x000000040a800000| Untracked | 0 +| 8|0x000000040b000000, 0x000000040b800000, 0x000000040b800000|100%| O| |TAMS 0x000000040b000000| PB 0x000000040b000000| Untracked | 0 +| 9|0x000000040b800000, 0x000000040c000000, 0x000000040c000000|100%| O| |TAMS 0x000000040b800000| PB 0x000000040b800000| Untracked | 0 +| 10|0x000000040c000000, 0x000000040c800000, 0x000000040c800000|100%| O| |TAMS 0x000000040c000000| PB 0x000000040c000000| Untracked | 0 +| 11|0x000000040c800000, 0x000000040d000000, 0x000000040d000000|100%| O| |TAMS 0x000000040c800000| PB 0x000000040c800000| Untracked | 0 +| 12|0x000000040d000000, 0x000000040d800000, 0x000000040d800000|100%| O| |TAMS 0x000000040d000000| PB 0x000000040d000000| Untracked | 0 +| 13|0x000000040d800000, 0x000000040e000000, 0x000000040e000000|100%| O| |TAMS 0x000000040d800000| PB 0x000000040d800000| Untracked | 0 +| 14|0x000000040e000000, 0x000000040e800000, 0x000000040e800000|100%| O| |TAMS 0x000000040e000000| PB 0x000000040e000000| Untracked | 0 +| 15|0x000000040e800000, 0x000000040f000000, 0x000000040f000000|100%|HS| |TAMS 0x000000040e800000| PB 0x000000040e800000| Complete | 0 +| 16|0x000000040f000000, 0x000000040f800000, 0x000000040f800000|100%|HC| |TAMS 0x000000040f000000| PB 0x000000040f000000| Complete | 0 +| 17|0x000000040f800000, 0x0000000410000000, 0x0000000410000000|100%| O| |TAMS 0x000000040f800000| PB 0x000000040f800000| Untracked | 0 +| 18|0x0000000410000000, 0x0000000410800000, 0x0000000410800000|100%| O| |TAMS 0x0000000410000000| PB 0x0000000410000000| Untracked | 0 +| 19|0x0000000410800000, 0x0000000411000000, 0x0000000411000000|100%| O| |TAMS 0x0000000410800000| PB 0x0000000410800000| Untracked | 0 +| 20|0x0000000411000000, 0x0000000411800000, 0x0000000411800000|100%| O| |TAMS 0x0000000411000000| PB 0x0000000411000000| Untracked | 0 +| 21|0x0000000411800000, 0x0000000412000000, 0x0000000412000000|100%| O| |TAMS 0x0000000411800000| PB 0x0000000411800000| Untracked | 0 +| 22|0x0000000412000000, 0x0000000412800000, 0x0000000412800000|100%| O| |TAMS 0x0000000412000000| PB 0x0000000412000000| Untracked | 0 +| 23|0x0000000412800000, 0x0000000413000000, 0x0000000413000000|100%| O| |TAMS 0x0000000412800000| PB 0x0000000412800000| Untracked | 0 +| 24|0x0000000413000000, 0x0000000413800000, 0x0000000413800000|100%| O| |TAMS 0x0000000413000000| PB 0x0000000413000000| Untracked | 0 +| 25|0x0000000413800000, 0x0000000414000000, 0x0000000414000000|100%| O| |TAMS 0x0000000413800000| PB 0x0000000413800000| Untracked | 0 +| 26|0x0000000414000000, 0x0000000414800000, 0x0000000414800000|100%| O| |TAMS 0x0000000414000000| PB 0x0000000414000000| Untracked | 0 +| 27|0x0000000414800000, 0x0000000415000000, 0x0000000415000000|100%| O| |TAMS 0x0000000414800000| PB 0x0000000414800000| Untracked | 0 +| 28|0x0000000415000000, 0x0000000415800000, 0x0000000415800000|100%| O| |TAMS 0x0000000415000000| PB 0x0000000415000000| Untracked | 0 +| 29|0x0000000415800000, 0x0000000416000000, 0x0000000416000000|100%| O| |TAMS 0x0000000415800000| PB 0x0000000415800000| Untracked | 0 +| 30|0x0000000416000000, 0x0000000416800000, 0x0000000416800000|100%| O| |TAMS 0x0000000416000000| PB 0x0000000416000000| Untracked | 0 +| 31|0x0000000416800000, 0x0000000417000000, 0x0000000417000000|100%| O| |TAMS 0x0000000416800000| PB 0x0000000416800000| Untracked | 0 +| 32|0x0000000417000000, 0x0000000417800000, 0x0000000417800000|100%|HS| |TAMS 0x0000000417000000| PB 0x0000000417000000| Complete | 0 +| 33|0x0000000417800000, 0x0000000418000000, 0x0000000418000000|100%|HC| |TAMS 0x0000000417800000| PB 0x0000000417800000| Complete | 0 +| 34|0x0000000418000000, 0x0000000418800000, 0x0000000418800000|100%|HC| |TAMS 0x0000000418000000| PB 0x0000000418000000| Complete | 0 +| 35|0x0000000418800000, 0x0000000419000000, 0x0000000419000000|100%| O| |TAMS 0x0000000418800000| PB 0x0000000418800000| Untracked | 0 +| 36|0x0000000419000000, 0x0000000419800000, 0x0000000419800000|100%| O| |TAMS 0x0000000419000000| PB 0x0000000419000000| Untracked | 0 +| 37|0x0000000419800000, 0x000000041a000000, 0x000000041a000000|100%| O| |TAMS 0x0000000419800000| PB 0x0000000419800000| Untracked | 0 +| 38|0x000000041a000000, 0x000000041a800000, 0x000000041a800000|100%| O| |TAMS 0x000000041a000000| PB 0x000000041a000000| Untracked | 0 +| 39|0x000000041a800000, 0x000000041b000000, 0x000000041b000000|100%| O| |TAMS 0x000000041a800000| PB 0x000000041a800000| Untracked | 0 +| 40|0x000000041b000000, 0x000000041b800000, 0x000000041b800000|100%| O| |TAMS 0x000000041b000000| PB 0x000000041b000000| Untracked | 0 +| 41|0x000000041b800000, 0x000000041c000000, 0x000000041c000000|100%| O| |TAMS 0x000000041b800000| PB 0x000000041b800000| Untracked | 0 +| 42|0x000000041c000000, 0x000000041c800000, 0x000000041c800000|100%| O| |TAMS 0x000000041c000000| PB 0x000000041c000000| Untracked | 0 +| 43|0x000000041c800000, 0x000000041d000000, 0x000000041d000000|100%| O| |TAMS 0x000000041c800000| PB 0x000000041c800000| Untracked | 0 +| 44|0x000000041d000000, 0x000000041d800000, 0x000000041d800000|100%| O| |TAMS 0x000000041d000000| PB 0x000000041d000000| Untracked | 0 +| 45|0x000000041d800000, 0x000000041e000000, 0x000000041e000000|100%| O| |TAMS 0x000000041d800000| PB 0x000000041d800000| Untracked | 0 +| 46|0x000000041e000000, 0x000000041e800000, 0x000000041e800000|100%| O| |TAMS 0x000000041e000000| PB 0x000000041e000000| Untracked | 0 +| 47|0x000000041e800000, 0x000000041f000000, 0x000000041f000000|100%| O| |TAMS 0x000000041e800000| PB 0x000000041e800000| Untracked | 0 +| 48|0x000000041f000000, 0x000000041f800000, 0x000000041f800000|100%| O| |TAMS 0x000000041f000000| PB 0x000000041f000000| Untracked | 0 +| 49|0x000000041f800000, 0x0000000420000000, 0x0000000420000000|100%| O| |TAMS 0x000000041f800000| PB 0x000000041f800000| Untracked | 0 +| 50|0x0000000420000000, 0x0000000420800000, 0x0000000420800000|100%| O| |TAMS 0x0000000420000000| PB 0x0000000420000000| Untracked | 0 +| 51|0x0000000420800000, 0x0000000421000000, 0x0000000421000000|100%| O| |TAMS 0x0000000420800000| PB 0x0000000420800000| Untracked | 0 +| 52|0x0000000421000000, 0x0000000421800000, 0x0000000421800000|100%| O| |TAMS 0x0000000421000000| PB 0x0000000421000000| Untracked | 0 +| 53|0x0000000421800000, 0x0000000422000000, 0x0000000422000000|100%| O| |TAMS 0x0000000421800000| PB 0x0000000421800000| Untracked | 0 +| 54|0x0000000422000000, 0x0000000422800000, 0x0000000422800000|100%| O| |TAMS 0x0000000422000000| PB 0x0000000422000000| Untracked | 0 +| 55|0x0000000422800000, 0x0000000423000000, 0x0000000423000000|100%| O| |TAMS 0x0000000422800000| PB 0x0000000422800000| Untracked | 0 +| 56|0x0000000423000000, 0x0000000423800000, 0x0000000423800000|100%| O| |TAMS 0x0000000423000000| PB 0x0000000423000000| Untracked | 0 +| 57|0x0000000423800000, 0x0000000424000000, 0x0000000424000000|100%| O| |TAMS 0x0000000423800000| PB 0x0000000423800000| Untracked | 0 +| 58|0x0000000424000000, 0x0000000424800000, 0x0000000424800000|100%| O| |TAMS 0x0000000424000000| PB 0x0000000424000000| Untracked | 0 +| 59|0x0000000424800000, 0x0000000425000000, 0x0000000425000000|100%| O| |TAMS 0x0000000424800000| PB 0x0000000424800000| Untracked | 0 +| 60|0x0000000425000000, 0x0000000425800000, 0x0000000425800000|100%| O| |TAMS 0x0000000425000000| PB 0x0000000425000000| Untracked | 0 +| 61|0x0000000425800000, 0x0000000426000000, 0x0000000426000000|100%| O| |TAMS 0x0000000425800000| PB 0x0000000425800000| Untracked | 0 +| 62|0x0000000426000000, 0x0000000426800000, 0x0000000426800000|100%| O| |TAMS 0x0000000426000000| PB 0x0000000426000000| Untracked | 0 +| 63|0x0000000426800000, 0x0000000427000000, 0x0000000427000000|100%| O| |TAMS 0x0000000426800000| PB 0x0000000426800000| Untracked | 0 +| 64|0x0000000427000000, 0x0000000427800000, 0x0000000427800000|100%| O| |TAMS 0x0000000427000000| PB 0x0000000427000000| Untracked | 0 +| 65|0x0000000427800000, 0x0000000428000000, 0x0000000428000000|100%| O| |TAMS 0x0000000427800000| PB 0x0000000427800000| Untracked | 0 +| 66|0x0000000428000000, 0x0000000428800000, 0x0000000428800000|100%| O| |TAMS 0x0000000428000000| PB 0x0000000428000000| Untracked | 0 +| 67|0x0000000428800000, 0x0000000429000000, 0x0000000429000000|100%| O| |TAMS 0x0000000428800000| PB 0x0000000428800000| Untracked | 0 +| 68|0x0000000429000000, 0x0000000429800000, 0x0000000429800000|100%| O| |TAMS 0x0000000429000000| PB 0x0000000429000000| Untracked | 0 +| 69|0x0000000429800000, 0x000000042a000000, 0x000000042a000000|100%| O| |TAMS 0x0000000429800000| PB 0x0000000429800000| Untracked | 0 +| 70|0x000000042a000000, 0x000000042a800000, 0x000000042a800000|100%|HS| |TAMS 0x000000042a000000| PB 0x000000042a000000| Complete | 0 +| 71|0x000000042a800000, 0x000000042b000000, 0x000000042b000000|100%|HC| |TAMS 0x000000042a800000| PB 0x000000042a800000| Complete | 0 +| 72|0x000000042b000000, 0x000000042b800000, 0x000000042b800000|100%|HC| |TAMS 0x000000042b000000| PB 0x000000042b000000| Complete | 0 +| 73|0x000000042b800000, 0x000000042c000000, 0x000000042c000000|100%|HC| |TAMS 0x000000042b800000| PB 0x000000042b800000| Complete | 0 +| 74|0x000000042c000000, 0x000000042c800000, 0x000000042c800000|100%|HC| |TAMS 0x000000042c000000| PB 0x000000042c000000| Complete | 0 +| 75|0x000000042c800000, 0x000000042d000000, 0x000000042d000000|100%| O| |TAMS 0x000000042c800000| PB 0x000000042c800000| Untracked | 0 +| 76|0x000000042d000000, 0x000000042d800000, 0x000000042d800000|100%| O| |TAMS 0x000000042d000000| PB 0x000000042d000000| Untracked | 0 +| 77|0x000000042d800000, 0x000000042e000000, 0x000000042e000000|100%| O| |TAMS 0x000000042d800000| PB 0x000000042d800000| Untracked | 0 +| 78|0x000000042e000000, 0x000000042e800000, 0x000000042e800000|100%| O| |TAMS 0x000000042e000000| PB 0x000000042e000000| Untracked | 0 +| 79|0x000000042e800000, 0x000000042f000000, 0x000000042f000000|100%| O| |TAMS 0x000000042e800000| PB 0x000000042e800000| Untracked | 0 +| 80|0x000000042f000000, 0x000000042f800000, 0x000000042f800000|100%| O| |TAMS 0x000000042f000000| PB 0x000000042f000000| Untracked | 0 +| 81|0x000000042f800000, 0x0000000430000000, 0x0000000430000000|100%| O| |TAMS 0x000000042f800000| PB 0x000000042f800000| Untracked | 0 +| 82|0x0000000430000000, 0x0000000430800000, 0x0000000430800000|100%| O| |TAMS 0x0000000430000000| PB 0x0000000430000000| Untracked | 0 +| 83|0x0000000430800000, 0x0000000431000000, 0x0000000431000000|100%| O| |TAMS 0x0000000430800000| PB 0x0000000430800000| Untracked | 0 +| 84|0x0000000431000000, 0x0000000431800000, 0x0000000431800000|100%| O| |TAMS 0x0000000431000000| PB 0x0000000431000000| Untracked | 0 +| 85|0x0000000431800000, 0x0000000432000000, 0x0000000432000000|100%| O| |TAMS 0x0000000431800000| PB 0x0000000431800000| Untracked | 0 +| 86|0x0000000432000000, 0x0000000432800000, 0x0000000432800000|100%| O| |TAMS 0x0000000432000000| PB 0x0000000432000000| Untracked | 0 +| 87|0x0000000432800000, 0x0000000433000000, 0x0000000433000000|100%| O| |TAMS 0x0000000432800000| PB 0x0000000432800000| Untracked | 0 +| 88|0x0000000433000000, 0x0000000433800000, 0x0000000433800000|100%| O| |TAMS 0x0000000433000000| PB 0x0000000433000000| Untracked | 0 +| 89|0x0000000433800000, 0x0000000434000000, 0x0000000434000000|100%| O| |TAMS 0x0000000433800000| PB 0x0000000433800000| Untracked | 0 +| 90|0x0000000434000000, 0x0000000434800000, 0x0000000434800000|100%| O| |TAMS 0x0000000434000000| PB 0x0000000434000000| Untracked | 0 +| 91|0x0000000434800000, 0x0000000435000000, 0x0000000435000000|100%| O| |TAMS 0x0000000434800000| PB 0x0000000434800000| Untracked | 0 +| 92|0x0000000435000000, 0x0000000435800000, 0x0000000435800000|100%| O| |TAMS 0x0000000435000000| PB 0x0000000435000000| Untracked | 0 +| 93|0x0000000435800000, 0x0000000436000000, 0x0000000436000000|100%| O| |TAMS 0x0000000435800000| PB 0x0000000435800000| Untracked | 0 +| 94|0x0000000436000000, 0x0000000436800000, 0x0000000436800000|100%| O| |TAMS 0x0000000436000000| PB 0x0000000436000000| Untracked | 0 +| 95|0x0000000436800000, 0x0000000437000000, 0x0000000437000000|100%| O| |TAMS 0x0000000436800000| PB 0x0000000436800000| Untracked | 0 +| 96|0x0000000437000000, 0x0000000437800000, 0x0000000437800000|100%| O| |TAMS 0x0000000437000000| PB 0x0000000437000000| Untracked | 0 +| 97|0x0000000437800000, 0x0000000438000000, 0x0000000438000000|100%| O| |TAMS 0x0000000437800000| PB 0x0000000437800000| Untracked | 0 +| 98|0x0000000438000000, 0x0000000438800000, 0x0000000438800000|100%| O| |TAMS 0x0000000438000000| PB 0x0000000438000000| Untracked | 0 +| 99|0x0000000438800000, 0x0000000439000000, 0x0000000439000000|100%| O| |TAMS 0x0000000438800000| PB 0x0000000438800000| Untracked | 0 +| 100|0x0000000439000000, 0x0000000439800000, 0x0000000439800000|100%| O| |TAMS 0x0000000439000000| PB 0x0000000439000000| Untracked | 0 +| 101|0x0000000439800000, 0x000000043a000000, 0x000000043a000000|100%| O| |TAMS 0x0000000439800000| PB 0x0000000439800000| Untracked | 0 +| 102|0x000000043a000000, 0x000000043a800000, 0x000000043a800000|100%| O| |TAMS 0x000000043a000000| PB 0x000000043a000000| Untracked | 0 +| 103|0x000000043a800000, 0x000000043b000000, 0x000000043b000000|100%| O| |TAMS 0x000000043a800000| PB 0x000000043a800000| Untracked | 0 +| 104|0x000000043b000000, 0x000000043b800000, 0x000000043b800000|100%| O| |TAMS 0x000000043b000000| PB 0x000000043b000000| Untracked | 0 +| 105|0x000000043b800000, 0x000000043c000000, 0x000000043c000000|100%| O| |TAMS 0x000000043b800000| PB 0x000000043b800000| Untracked | 0 +| 106|0x000000043c000000, 0x000000043c800000, 0x000000043c800000|100%| O| |TAMS 0x000000043c000000| PB 0x000000043c000000| Untracked | 0 +| 107|0x000000043c800000, 0x000000043d000000, 0x000000043d000000|100%| O| |TAMS 0x000000043c800000| PB 0x000000043c800000| Untracked | 0 +| 108|0x000000043d000000, 0x000000043d800000, 0x000000043d800000|100%| O| |TAMS 0x000000043d000000| PB 0x000000043d000000| Untracked | 0 +| 109|0x000000043d800000, 0x000000043e000000, 0x000000043e000000|100%| O| |TAMS 0x000000043d800000| PB 0x000000043d800000| Untracked | 0 +| 110|0x000000043e000000, 0x000000043e800000, 0x000000043e800000|100%| O| |TAMS 0x000000043e000000| PB 0x000000043e000000| Untracked | 0 +| 111|0x000000043e800000, 0x000000043f000000, 0x000000043f000000|100%| O| |TAMS 0x000000043e800000| PB 0x000000043e800000| Untracked | 0 +| 112|0x000000043f000000, 0x000000043f800000, 0x000000043f800000|100%| O| |TAMS 0x000000043f000000| PB 0x000000043f000000| Untracked | 0 +| 113|0x000000043f800000, 0x0000000440000000, 0x0000000440000000|100%| O| |TAMS 0x000000043f800000| PB 0x000000043f800000| Untracked | 0 +| 114|0x0000000440000000, 0x0000000440800000, 0x0000000440800000|100%| O| |TAMS 0x0000000440000000| PB 0x0000000440000000| Untracked | 0 +| 115|0x0000000440800000, 0x0000000441000000, 0x0000000441000000|100%| O| |TAMS 0x0000000440800000| PB 0x0000000440800000| Untracked | 0 +| 116|0x0000000441000000, 0x0000000441800000, 0x0000000441800000|100%| O| |TAMS 0x0000000441000000| PB 0x0000000441000000| Untracked | 0 +| 117|0x0000000441800000, 0x0000000442000000, 0x0000000442000000|100%| O| |TAMS 0x0000000441800000| PB 0x0000000441800000| Untracked | 0 +| 118|0x0000000442000000, 0x0000000442800000, 0x0000000442800000|100%| O| |TAMS 0x0000000442000000| PB 0x0000000442000000| Untracked | 0 +| 119|0x0000000442800000, 0x0000000443000000, 0x0000000443000000|100%| O| |TAMS 0x0000000442800000| PB 0x0000000442800000| Untracked | 0 +| 120|0x0000000443000000, 0x0000000443800000, 0x0000000443800000|100%| O| |TAMS 0x0000000443000000| PB 0x0000000443000000| Untracked | 0 +| 121|0x0000000443800000, 0x0000000444000000, 0x0000000444000000|100%| O| |TAMS 0x0000000443800000| PB 0x0000000443800000| Untracked | 0 +| 122|0x0000000444000000, 0x0000000444800000, 0x0000000444800000|100%| O| |TAMS 0x0000000444000000| PB 0x0000000444000000| Untracked | 0 +| 123|0x0000000444800000, 0x0000000445000000, 0x0000000445000000|100%| O| |TAMS 0x0000000444800000| PB 0x0000000444800000| Untracked | 0 +| 124|0x0000000445000000, 0x0000000445800000, 0x0000000445800000|100%| O| |TAMS 0x0000000445000000| PB 0x0000000445000000| Untracked | 0 +| 125|0x0000000445800000, 0x0000000446000000, 0x0000000446000000|100%| O| |TAMS 0x0000000445800000| PB 0x0000000445800000| Untracked | 0 +| 126|0x0000000446000000, 0x0000000446800000, 0x0000000446800000|100%| O| |TAMS 0x0000000446000000| PB 0x0000000446000000| Untracked | 0 +| 127|0x0000000446800000, 0x0000000447000000, 0x0000000447000000|100%| O| |TAMS 0x0000000446800000| PB 0x0000000446800000| Untracked | 0 +| 128|0x0000000447000000, 0x0000000447800000, 0x0000000447800000|100%| O| |TAMS 0x0000000447000000| PB 0x0000000447000000| Untracked | 0 +| 129|0x0000000447800000, 0x0000000448000000, 0x0000000448000000|100%|HS| |TAMS 0x0000000447800000| PB 0x0000000447800000| Complete | 0 +| 130|0x0000000448000000, 0x0000000448800000, 0x0000000448800000|100%|HC| |TAMS 0x0000000448000000| PB 0x0000000448000000| Complete | 0 +| 131|0x0000000448800000, 0x0000000449000000, 0x0000000449000000|100%|HC| |TAMS 0x0000000448800000| PB 0x0000000448800000| Complete | 0 +| 132|0x0000000449000000, 0x0000000449800000, 0x0000000449800000|100%|HC| |TAMS 0x0000000449000000| PB 0x0000000449000000| Complete | 0 +| 133|0x0000000449800000, 0x000000044a000000, 0x000000044a000000|100%|HC| |TAMS 0x0000000449800000| PB 0x0000000449800000| Complete | 0 +| 134|0x000000044a000000, 0x000000044a800000, 0x000000044a800000|100%|HC| |TAMS 0x000000044a000000| PB 0x000000044a000000| Complete | 0 +| 135|0x000000044a800000, 0x000000044b000000, 0x000000044b000000|100%|HC| |TAMS 0x000000044a800000| PB 0x000000044a800000| Complete | 0 +| 136|0x000000044b000000, 0x000000044b800000, 0x000000044b800000|100%|HC| |TAMS 0x000000044b000000| PB 0x000000044b000000| Complete | 0 +| 137|0x000000044b800000, 0x000000044c000000, 0x000000044c000000|100%|HC| |TAMS 0x000000044b800000| PB 0x000000044b800000| Complete | 0 +| 138|0x000000044c000000, 0x000000044c800000, 0x000000044c800000|100%| O| |TAMS 0x000000044c000000| PB 0x000000044c000000| Untracked | 0 +| 139|0x000000044c800000, 0x000000044d000000, 0x000000044d000000|100%| O| |TAMS 0x000000044c800000| PB 0x000000044c800000| Untracked | 0 +| 140|0x000000044d000000, 0x000000044d800000, 0x000000044d800000|100%| O| |TAMS 0x000000044d000000| PB 0x000000044d000000| Untracked | 0 +| 141|0x000000044d800000, 0x000000044e000000, 0x000000044e000000|100%| O| |TAMS 0x000000044d800000| PB 0x000000044d800000| Untracked | 0 +| 142|0x000000044e000000, 0x000000044e800000, 0x000000044e800000|100%| O| |TAMS 0x000000044e000000| PB 0x000000044e000000| Untracked | 0 +| 143|0x000000044e800000, 0x000000044f000000, 0x000000044f000000|100%| O| |TAMS 0x000000044e800000| PB 0x000000044e800000| Untracked | 0 +| 144|0x000000044f000000, 0x000000044f800000, 0x000000044f800000|100%| O| |TAMS 0x000000044f000000| PB 0x000000044f000000| Untracked | 0 +| 145|0x000000044f800000, 0x0000000450000000, 0x0000000450000000|100%| O| |TAMS 0x000000044f800000| PB 0x000000044f800000| Untracked | 0 +| 146|0x0000000450000000, 0x0000000450800000, 0x0000000450800000|100%| O| |TAMS 0x0000000450000000| PB 0x0000000450000000| Untracked | 0 +| 147|0x0000000450800000, 0x0000000451000000, 0x0000000451000000|100%| O| |TAMS 0x0000000450800000| PB 0x0000000450800000| Untracked | 0 +| 148|0x0000000451000000, 0x0000000451800000, 0x0000000451800000|100%| O| |TAMS 0x0000000451000000| PB 0x0000000451000000| Untracked | 0 +| 149|0x0000000451800000, 0x0000000452000000, 0x0000000452000000|100%| O| |TAMS 0x0000000451800000| PB 0x0000000451800000| Untracked | 0 +| 150|0x0000000452000000, 0x0000000452800000, 0x0000000452800000|100%| O| |TAMS 0x0000000452000000| PB 0x0000000452000000| Untracked | 0 +| 151|0x0000000452800000, 0x0000000453000000, 0x0000000453000000|100%| O| |TAMS 0x0000000452800000| PB 0x0000000452800000| Untracked | 0 +| 152|0x0000000453000000, 0x0000000453800000, 0x0000000453800000|100%| O| |TAMS 0x0000000453000000| PB 0x0000000453000000| Untracked | 0 +| 153|0x0000000453800000, 0x0000000454000000, 0x0000000454000000|100%| O| |TAMS 0x0000000453800000| PB 0x0000000453800000| Untracked | 0 +| 154|0x0000000454000000, 0x0000000454800000, 0x0000000454800000|100%| O| |TAMS 0x0000000454000000| PB 0x0000000454000000| Untracked | 0 +| 155|0x0000000454800000, 0x0000000455000000, 0x0000000455000000|100%| O| |TAMS 0x0000000454800000| PB 0x0000000454800000| Untracked | 0 +| 156|0x0000000455000000, 0x0000000455800000, 0x0000000455800000|100%| O| |TAMS 0x0000000455000000| PB 0x0000000455000000| Untracked | 0 +| 157|0x0000000455800000, 0x0000000456000000, 0x0000000456000000|100%| O| |TAMS 0x0000000455800000| PB 0x0000000455800000| Untracked | 0 +| 158|0x0000000456000000, 0x0000000456800000, 0x0000000456800000|100%| O| |TAMS 0x0000000456000000| PB 0x0000000456000000| Untracked | 0 +| 159|0x0000000456800000, 0x0000000457000000, 0x0000000457000000|100%| O| |TAMS 0x0000000456800000| PB 0x0000000456800000| Untracked | 0 +| 160|0x0000000457000000, 0x0000000457800000, 0x0000000457800000|100%| O| |TAMS 0x0000000457000000| PB 0x0000000457000000| Untracked | 0 +| 161|0x0000000457800000, 0x0000000458000000, 0x0000000458000000|100%| O| |TAMS 0x0000000457800000| PB 0x0000000457800000| Untracked | 0 +| 162|0x0000000458000000, 0x0000000458800000, 0x0000000458800000|100%| O| |TAMS 0x0000000458000000| PB 0x0000000458000000| Untracked | 0 +| 163|0x0000000458800000, 0x0000000459000000, 0x0000000459000000|100%| O| |TAMS 0x0000000458800000| PB 0x0000000458800000| Untracked | 0 +| 164|0x0000000459000000, 0x0000000459800000, 0x0000000459800000|100%| O| |TAMS 0x0000000459000000| PB 0x0000000459000000| Untracked | 0 +| 165|0x0000000459800000, 0x000000045a000000, 0x000000045a000000|100%| O| |TAMS 0x0000000459800000| PB 0x0000000459800000| Untracked | 0 +| 166|0x000000045a000000, 0x000000045a800000, 0x000000045a800000|100%| O| |TAMS 0x000000045a000000| PB 0x000000045a000000| Untracked | 0 +| 167|0x000000045a800000, 0x000000045b000000, 0x000000045b000000|100%| O| |TAMS 0x000000045a800000| PB 0x000000045a800000| Untracked | 0 +| 168|0x000000045b000000, 0x000000045b800000, 0x000000045b800000|100%| O| |TAMS 0x000000045b000000| PB 0x000000045b000000| Untracked | 0 +| 169|0x000000045b800000, 0x000000045c000000, 0x000000045c000000|100%| O| |TAMS 0x000000045b800000| PB 0x000000045b800000| Untracked | 0 +| 170|0x000000045c000000, 0x000000045c800000, 0x000000045c800000|100%| O| |TAMS 0x000000045c000000| PB 0x000000045c000000| Untracked | 0 +| 171|0x000000045c800000, 0x000000045d000000, 0x000000045d000000|100%| O| |TAMS 0x000000045c800000| PB 0x000000045c800000| Untracked | 0 +| 172|0x000000045d000000, 0x000000045d800000, 0x000000045d800000|100%| O| |TAMS 0x000000045d000000| PB 0x000000045d000000| Untracked | 0 +| 173|0x000000045d800000, 0x000000045e000000, 0x000000045e000000|100%| O| |TAMS 0x000000045d800000| PB 0x000000045d800000| Untracked | 0 +| 174|0x000000045e000000, 0x000000045e800000, 0x000000045e800000|100%| O| |TAMS 0x000000045e000000| PB 0x000000045e000000| Untracked | 0 +| 175|0x000000045e800000, 0x000000045f000000, 0x000000045f000000|100%| O| |TAMS 0x000000045e800000| PB 0x000000045e800000| Untracked | 0 +| 176|0x000000045f000000, 0x000000045f800000, 0x000000045f800000|100%| O| |TAMS 0x000000045f000000| PB 0x000000045f000000| Untracked | 0 +| 177|0x000000045f800000, 0x0000000460000000, 0x0000000460000000|100%| O| |TAMS 0x000000045f800000| PB 0x000000045f800000| Untracked | 0 +| 178|0x0000000460000000, 0x0000000460800000, 0x0000000460800000|100%| O| |TAMS 0x0000000460000000| PB 0x0000000460000000| Untracked | 0 +| 179|0x0000000460800000, 0x0000000461000000, 0x0000000461000000|100%| O| |TAMS 0x0000000460800000| PB 0x0000000460800000| Untracked | 0 +| 180|0x0000000461000000, 0x0000000461800000, 0x0000000461800000|100%| O| |TAMS 0x0000000461000000| PB 0x0000000461000000| Untracked | 0 +| 181|0x0000000461800000, 0x0000000462000000, 0x0000000462000000|100%| O| |TAMS 0x0000000461800000| PB 0x0000000461800000| Untracked | 0 +| 182|0x0000000462000000, 0x0000000462800000, 0x0000000462800000|100%| O| |TAMS 0x0000000462000000| PB 0x0000000462000000| Untracked | 0 +| 183|0x0000000462800000, 0x0000000463000000, 0x0000000463000000|100%| O| |TAMS 0x0000000462800000| PB 0x0000000462800000| Untracked | 0 +| 184|0x0000000463000000, 0x0000000463800000, 0x0000000463800000|100%| O| |TAMS 0x0000000463000000| PB 0x0000000463000000| Untracked | 0 +| 185|0x0000000463800000, 0x0000000464000000, 0x0000000464000000|100%| O| |TAMS 0x0000000463800000| PB 0x0000000463800000| Untracked | 0 +| 186|0x0000000464000000, 0x0000000464800000, 0x0000000464800000|100%| O| |TAMS 0x0000000464000000| PB 0x0000000464000000| Untracked | 0 +| 187|0x0000000464800000, 0x0000000465000000, 0x0000000465000000|100%| O| |TAMS 0x0000000464800000| PB 0x0000000464800000| Untracked | 0 +| 188|0x0000000465000000, 0x0000000465800000, 0x0000000465800000|100%| O| |TAMS 0x0000000465000000| PB 0x0000000465000000| Untracked | 0 +| 189|0x0000000465800000, 0x0000000466000000, 0x0000000466000000|100%| O| |TAMS 0x0000000465800000| PB 0x0000000465800000| Untracked | 0 +| 190|0x0000000466000000, 0x0000000466800000, 0x0000000466800000|100%| O| |TAMS 0x0000000466000000| PB 0x0000000466000000| Untracked | 0 +| 191|0x0000000466800000, 0x0000000467000000, 0x0000000467000000|100%| O| |TAMS 0x0000000466800000| PB 0x0000000466800000| Untracked | 0 +| 192|0x0000000467000000, 0x0000000467800000, 0x0000000467800000|100%| O| |TAMS 0x0000000467000000| PB 0x0000000467000000| Untracked | 0 +| 193|0x0000000467800000, 0x0000000468000000, 0x0000000468000000|100%| O| |TAMS 0x0000000467800000| PB 0x0000000467800000| Untracked | 0 +| 194|0x0000000468000000, 0x0000000468800000, 0x0000000468800000|100%| O| |TAMS 0x0000000468000000| PB 0x0000000468000000| Untracked | 0 +| 195|0x0000000468800000, 0x0000000469000000, 0x0000000469000000|100%| O| |TAMS 0x0000000468800000| PB 0x0000000468800000| Untracked | 0 +| 196|0x0000000469000000, 0x0000000469800000, 0x0000000469800000|100%| O| |TAMS 0x0000000469000000| PB 0x0000000469000000| Untracked | 0 +| 197|0x0000000469800000, 0x000000046a000000, 0x000000046a000000|100%| O| |TAMS 0x0000000469800000| PB 0x0000000469800000| Untracked | 0 +| 198|0x000000046a000000, 0x000000046a800000, 0x000000046a800000|100%| O| |TAMS 0x000000046a000000| PB 0x000000046a000000| Untracked | 0 +| 199|0x000000046a800000, 0x000000046b000000, 0x000000046b000000|100%| O| |TAMS 0x000000046a800000| PB 0x000000046a800000| Untracked | 0 +| 200|0x000000046b000000, 0x000000046b800000, 0x000000046b800000|100%| O| |TAMS 0x000000046b000000| PB 0x000000046b000000| Untracked | 0 +| 201|0x000000046b800000, 0x000000046c000000, 0x000000046c000000|100%| O| |TAMS 0x000000046b800000| PB 0x000000046b800000| Untracked | 0 +| 202|0x000000046c000000, 0x000000046c800000, 0x000000046c800000|100%| O| |TAMS 0x000000046c000000| PB 0x000000046c000000| Untracked | 0 +| 203|0x000000046c800000, 0x000000046d000000, 0x000000046d000000|100%| O| |TAMS 0x000000046c800000| PB 0x000000046c800000| Untracked | 0 +| 204|0x000000046d000000, 0x000000046d800000, 0x000000046d800000|100%| O| |TAMS 0x000000046d000000| PB 0x000000046d000000| Untracked | 0 +| 205|0x000000046d800000, 0x000000046e000000, 0x000000046e000000|100%| O| |TAMS 0x000000046d800000| PB 0x000000046d800000| Untracked | 0 +| 206|0x000000046e000000, 0x000000046e800000, 0x000000046e800000|100%| O| |TAMS 0x000000046e000000| PB 0x000000046e000000| Untracked | 0 +| 207|0x000000046e800000, 0x000000046f000000, 0x000000046f000000|100%| O| |TAMS 0x000000046e800000| PB 0x000000046e800000| Untracked | 0 +| 208|0x000000046f000000, 0x000000046f800000, 0x000000046f800000|100%| O| |TAMS 0x000000046f000000| PB 0x000000046f000000| Untracked | 0 +| 209|0x000000046f800000, 0x0000000470000000, 0x0000000470000000|100%| O| |TAMS 0x000000046f800000| PB 0x000000046f800000| Untracked | 0 +| 210|0x0000000470000000, 0x0000000470800000, 0x0000000470800000|100%| O| |TAMS 0x0000000470000000| PB 0x0000000470000000| Untracked | 0 +| 211|0x0000000470800000, 0x0000000471000000, 0x0000000471000000|100%| O| |TAMS 0x0000000470800000| PB 0x0000000470800000| Untracked | 0 +| 212|0x0000000471000000, 0x0000000471800000, 0x0000000471800000|100%| O| |TAMS 0x0000000471000000| PB 0x0000000471000000| Untracked | 0 +| 213|0x0000000471800000, 0x0000000472000000, 0x0000000472000000|100%| O| |TAMS 0x0000000471800000| PB 0x0000000471800000| Untracked | 0 +| 214|0x0000000472000000, 0x0000000472800000, 0x0000000472800000|100%| O| |TAMS 0x0000000472000000| PB 0x0000000472000000| Untracked | 0 +| 215|0x0000000472800000, 0x0000000473000000, 0x0000000473000000|100%| O| |TAMS 0x0000000472800000| PB 0x0000000472800000| Untracked | 0 +| 216|0x0000000473000000, 0x0000000473800000, 0x0000000473800000|100%| O| |TAMS 0x0000000473000000| PB 0x0000000473000000| Untracked | 0 +| 217|0x0000000473800000, 0x0000000474000000, 0x0000000474000000|100%| O| |TAMS 0x0000000473800000| PB 0x0000000473800000| Untracked | 0 +| 218|0x0000000474000000, 0x0000000474800000, 0x0000000474800000|100%| O| |TAMS 0x0000000474000000| PB 0x0000000474000000| Untracked | 0 +| 219|0x0000000474800000, 0x0000000475000000, 0x0000000475000000|100%| O| |TAMS 0x0000000474800000| PB 0x0000000474800000| Untracked | 0 +| 220|0x0000000475000000, 0x0000000475800000, 0x0000000475800000|100%| O| |TAMS 0x0000000475000000| PB 0x0000000475000000| Untracked | 0 +| 221|0x0000000475800000, 0x0000000476000000, 0x0000000476000000|100%| O| |TAMS 0x0000000475800000| PB 0x0000000475800000| Untracked | 0 +| 222|0x0000000476000000, 0x0000000476800000, 0x0000000476800000|100%| O| |TAMS 0x0000000476000000| PB 0x0000000476000000| Untracked | 0 +| 223|0x0000000476800000, 0x0000000477000000, 0x0000000477000000|100%| O| |TAMS 0x0000000476800000| PB 0x0000000476800000| Untracked | 0 +| 224|0x0000000477000000, 0x0000000477800000, 0x0000000477800000|100%| O| |TAMS 0x0000000477000000| PB 0x0000000477000000| Untracked | 0 +| 225|0x0000000477800000, 0x0000000478000000, 0x0000000478000000|100%| O| |TAMS 0x0000000477800000| PB 0x0000000477800000| Untracked | 0 +| 226|0x0000000478000000, 0x0000000478800000, 0x0000000478800000|100%| O| |TAMS 0x0000000478000000| PB 0x0000000478000000| Untracked | 0 +| 227|0x0000000478800000, 0x0000000479000000, 0x0000000479000000|100%| O| |TAMS 0x0000000478800000| PB 0x0000000478800000| Untracked | 0 +| 228|0x0000000479000000, 0x0000000479800000, 0x0000000479800000|100%| O| |TAMS 0x0000000479000000| PB 0x0000000479000000| Untracked | 0 +| 229|0x0000000479800000, 0x000000047a000000, 0x000000047a000000|100%| O| |TAMS 0x0000000479800000| PB 0x0000000479800000| Untracked | 0 +| 230|0x000000047a000000, 0x000000047a800000, 0x000000047a800000|100%| O| |TAMS 0x000000047a000000| PB 0x000000047a000000| Untracked | 0 +| 231|0x000000047a800000, 0x000000047b000000, 0x000000047b000000|100%| O| |TAMS 0x000000047a800000| PB 0x000000047a800000| Untracked | 0 +| 232|0x000000047b000000, 0x000000047b800000, 0x000000047b800000|100%| O| |TAMS 0x000000047b000000| PB 0x000000047b000000| Untracked | 0 +| 233|0x000000047b800000, 0x000000047c000000, 0x000000047c000000|100%| O| |TAMS 0x000000047b800000| PB 0x000000047b800000| Untracked | 0 +| 234|0x000000047c000000, 0x000000047c800000, 0x000000047c800000|100%| O| |TAMS 0x000000047c000000| PB 0x000000047c000000| Untracked | 0 +| 235|0x000000047c800000, 0x000000047d000000, 0x000000047d000000|100%| O| |TAMS 0x000000047c800000| PB 0x000000047c800000| Untracked | 0 +| 236|0x000000047d000000, 0x000000047d800000, 0x000000047d800000|100%| O| |TAMS 0x000000047d000000| PB 0x000000047d000000| Untracked | 0 +| 237|0x000000047d800000, 0x000000047e000000, 0x000000047e000000|100%| O| |TAMS 0x000000047d800000| PB 0x000000047d800000| Untracked | 0 +| 238|0x000000047e000000, 0x000000047e800000, 0x000000047e800000|100%| O| |TAMS 0x000000047e000000| PB 0x000000047e000000| Untracked | 0 +| 239|0x000000047e800000, 0x000000047f000000, 0x000000047f000000|100%| O| |TAMS 0x000000047e800000| PB 0x000000047e800000| Untracked | 0 +| 240|0x000000047f000000, 0x000000047f800000, 0x000000047f800000|100%| O| |TAMS 0x000000047f000000| PB 0x000000047f000000| Untracked | 0 +| 241|0x000000047f800000, 0x0000000480000000, 0x0000000480000000|100%| O| |TAMS 0x000000047f800000| PB 0x000000047f800000| Untracked | 0 +| 242|0x0000000480000000, 0x0000000480800000, 0x0000000480800000|100%| O| |TAMS 0x0000000480000000| PB 0x0000000480000000| Untracked | 0 +| 243|0x0000000480800000, 0x0000000481000000, 0x0000000481000000|100%| O| |TAMS 0x0000000480800000| PB 0x0000000480800000| Untracked | 0 +| 244|0x0000000481000000, 0x0000000481800000, 0x0000000481800000|100%| O| |TAMS 0x0000000481000000| PB 0x0000000481000000| Untracked | 0 +| 245|0x0000000481800000, 0x0000000482000000, 0x0000000482000000|100%| O| |TAMS 0x0000000481800000| PB 0x0000000481800000| Untracked | 0 +| 246|0x0000000482000000, 0x0000000482800000, 0x0000000482800000|100%| O| |TAMS 0x0000000482000000| PB 0x0000000482000000| Untracked | 0 +| 247|0x0000000482800000, 0x0000000483000000, 0x0000000483000000|100%| O| |TAMS 0x0000000482800000| PB 0x0000000482800000| Untracked | 0 +| 248|0x0000000483000000, 0x0000000483800000, 0x0000000483800000|100%| O| |TAMS 0x0000000483000000| PB 0x0000000483000000| Untracked | 0 +| 249|0x0000000483800000, 0x0000000484000000, 0x0000000484000000|100%| O| |TAMS 0x0000000483800000| PB 0x0000000483800000| Untracked | 0 +| 250|0x0000000484000000, 0x0000000484800000, 0x0000000484800000|100%| O| |TAMS 0x0000000484000000| PB 0x0000000484000000| Untracked | 0 +| 251|0x0000000484800000, 0x0000000485000000, 0x0000000485000000|100%| O| |TAMS 0x0000000484800000| PB 0x0000000484800000| Untracked | 0 +| 252|0x0000000485000000, 0x0000000485800000, 0x0000000485800000|100%| O| |TAMS 0x0000000485000000| PB 0x0000000485000000| Untracked | 0 +| 253|0x0000000485800000, 0x0000000486000000, 0x0000000486000000|100%| O| |TAMS 0x0000000485800000| PB 0x0000000485800000| Untracked | 0 +| 254|0x0000000486000000, 0x0000000486800000, 0x0000000486800000|100%| O| |TAMS 0x0000000486000000| PB 0x0000000486000000| Untracked | 0 +| 255|0x0000000486800000, 0x0000000487000000, 0x0000000487000000|100%| O| |TAMS 0x0000000486800000| PB 0x0000000486800000| Untracked | 0 +| 256|0x0000000487000000, 0x0000000487800000, 0x0000000487800000|100%| O| |TAMS 0x0000000487000000| PB 0x0000000487000000| Untracked | 0 +| 257|0x0000000487800000, 0x0000000488000000, 0x0000000488000000|100%| O| |TAMS 0x0000000487800000| PB 0x0000000487800000| Untracked | 0 +| 258|0x0000000488000000, 0x0000000488800000, 0x0000000488800000|100%| O| |TAMS 0x0000000488000000| PB 0x0000000488000000| Untracked | 0 +| 259|0x0000000488800000, 0x0000000489000000, 0x0000000489000000|100%| O| |TAMS 0x0000000488800000| PB 0x0000000488800000| Untracked | 0 +| 260|0x0000000489000000, 0x0000000489800000, 0x0000000489800000|100%| O| |TAMS 0x0000000489000000| PB 0x0000000489000000| Untracked | 0 +| 261|0x0000000489800000, 0x000000048a000000, 0x000000048a000000|100%| O| |TAMS 0x0000000489800000| PB 0x0000000489800000| Untracked | 0 +| 262|0x000000048a000000, 0x000000048a800000, 0x000000048a800000|100%|HS| |TAMS 0x000000048a000000| PB 0x000000048a000000| Complete | 0 +| 263|0x000000048a800000, 0x000000048b000000, 0x000000048b000000|100%|HC| |TAMS 0x000000048a800000| PB 0x000000048a800000| Complete | 0 +| 264|0x000000048b000000, 0x000000048b800000, 0x000000048b800000|100%|HC| |TAMS 0x000000048b000000| PB 0x000000048b000000| Complete | 0 +| 265|0x000000048b800000, 0x000000048c000000, 0x000000048c000000|100%|HC| |TAMS 0x000000048b800000| PB 0x000000048b800000| Complete | 0 +| 266|0x000000048c000000, 0x000000048c800000, 0x000000048c800000|100%|HC| |TAMS 0x000000048c000000| PB 0x000000048c000000| Complete | 0 +| 267|0x000000048c800000, 0x000000048d000000, 0x000000048d000000|100%|HC| |TAMS 0x000000048c800000| PB 0x000000048c800000| Complete | 0 +| 268|0x000000048d000000, 0x000000048d800000, 0x000000048d800000|100%|HC| |TAMS 0x000000048d000000| PB 0x000000048d000000| Complete | 0 +| 269|0x000000048d800000, 0x000000048e000000, 0x000000048e000000|100%|HC| |TAMS 0x000000048d800000| PB 0x000000048d800000| Complete | 0 +| 270|0x000000048e000000, 0x000000048e800000, 0x000000048e800000|100%|HC| |TAMS 0x000000048e000000| PB 0x000000048e000000| Complete | 0 +| 271|0x000000048e800000, 0x000000048f000000, 0x000000048f000000|100%|HC| |TAMS 0x000000048e800000| PB 0x000000048e800000| Complete | 0 +| 272|0x000000048f000000, 0x000000048f800000, 0x000000048f800000|100%|HC| |TAMS 0x000000048f000000| PB 0x000000048f000000| Complete | 0 +| 273|0x000000048f800000, 0x0000000490000000, 0x0000000490000000|100%|HC| |TAMS 0x000000048f800000| PB 0x000000048f800000| Complete | 0 +| 274|0x0000000490000000, 0x0000000490800000, 0x0000000490800000|100%|HC| |TAMS 0x0000000490000000| PB 0x0000000490000000| Complete | 0 +| 275|0x0000000490800000, 0x0000000491000000, 0x0000000491000000|100%|HC| |TAMS 0x0000000490800000| PB 0x0000000490800000| Complete | 0 +| 276|0x0000000491000000, 0x0000000491800000, 0x0000000491800000|100%|HC| |TAMS 0x0000000491000000| PB 0x0000000491000000| Complete | 0 +| 277|0x0000000491800000, 0x0000000492000000, 0x0000000492000000|100%|HC| |TAMS 0x0000000491800000| PB 0x0000000491800000| Complete | 0 +| 278|0x0000000492000000, 0x0000000492800000, 0x0000000492800000|100%|HC| |TAMS 0x0000000492000000| PB 0x0000000492000000| Complete | 0 +| 279|0x0000000492800000, 0x0000000493000000, 0x0000000493000000|100%| O| |TAMS 0x0000000492800000| PB 0x0000000492800000| Untracked | 0 +| 280|0x0000000493000000, 0x0000000493800000, 0x0000000493800000|100%| O| |TAMS 0x0000000493000000| PB 0x0000000493000000| Untracked | 0 +| 281|0x0000000493800000, 0x0000000494000000, 0x0000000494000000|100%| O| |TAMS 0x0000000493800000| PB 0x0000000493800000| Untracked | 0 +| 282|0x0000000494000000, 0x0000000494800000, 0x0000000494800000|100%| O| |TAMS 0x0000000494000000| PB 0x0000000494000000| Untracked | 0 +| 283|0x0000000494800000, 0x0000000495000000, 0x0000000495000000|100%| O| |TAMS 0x0000000494800000| PB 0x0000000494800000| Untracked | 0 +| 284|0x0000000495000000, 0x0000000495800000, 0x0000000495800000|100%| O| |TAMS 0x0000000495000000| PB 0x0000000495000000| Untracked | 0 +| 285|0x0000000495800000, 0x0000000496000000, 0x0000000496000000|100%| O| |TAMS 0x0000000495800000| PB 0x0000000495800000| Untracked | 0 +| 286|0x0000000496000000, 0x0000000496800000, 0x0000000496800000|100%| O| |TAMS 0x0000000496000000| PB 0x0000000496000000| Untracked | 0 +| 287|0x0000000496800000, 0x0000000497000000, 0x0000000497000000|100%| O| |TAMS 0x0000000496800000| PB 0x0000000496800000| Untracked | 0 +| 288|0x0000000497000000, 0x0000000497800000, 0x0000000497800000|100%| O| |TAMS 0x0000000497000000| PB 0x0000000497000000| Untracked | 0 +| 289|0x0000000497800000, 0x0000000498000000, 0x0000000498000000|100%| O| |TAMS 0x0000000497800000| PB 0x0000000497800000| Untracked | 0 +| 290|0x0000000498000000, 0x0000000498800000, 0x0000000498800000|100%| O| |TAMS 0x0000000498000000| PB 0x0000000498000000| Untracked | 0 +| 291|0x0000000498800000, 0x0000000499000000, 0x0000000499000000|100%| O| |TAMS 0x0000000498800000| PB 0x0000000498800000| Untracked | 0 +| 292|0x0000000499000000, 0x0000000499800000, 0x0000000499800000|100%| O| |TAMS 0x0000000499000000| PB 0x0000000499000000| Untracked | 0 +| 293|0x0000000499800000, 0x000000049a000000, 0x000000049a000000|100%| O| |TAMS 0x0000000499800000| PB 0x0000000499800000| Untracked | 0 +| 294|0x000000049a000000, 0x000000049a800000, 0x000000049a800000|100%| O| |TAMS 0x000000049a000000| PB 0x000000049a000000| Untracked | 0 +| 295|0x000000049a800000, 0x000000049b000000, 0x000000049b000000|100%| O| |TAMS 0x000000049a800000| PB 0x000000049a800000| Untracked | 0 +| 296|0x000000049b000000, 0x000000049b800000, 0x000000049b800000|100%| O| |TAMS 0x000000049b000000| PB 0x000000049b000000| Untracked | 0 +| 297|0x000000049b800000, 0x000000049c000000, 0x000000049c000000|100%| O| |TAMS 0x000000049b800000| PB 0x000000049b800000| Untracked | 0 +| 298|0x000000049c000000, 0x000000049c800000, 0x000000049c800000|100%| O| |TAMS 0x000000049c000000| PB 0x000000049c000000| Untracked | 0 +| 299|0x000000049c800000, 0x000000049d000000, 0x000000049d000000|100%| O| |TAMS 0x000000049c800000| PB 0x000000049c800000| Untracked | 0 +| 300|0x000000049d000000, 0x000000049d800000, 0x000000049d800000|100%| O| |TAMS 0x000000049d000000| PB 0x000000049d000000| Untracked | 0 +| 301|0x000000049d800000, 0x000000049e000000, 0x000000049e000000|100%| O| |TAMS 0x000000049d800000| PB 0x000000049d800000| Untracked | 0 +| 302|0x000000049e000000, 0x000000049e800000, 0x000000049e800000|100%| O| |TAMS 0x000000049e000000| PB 0x000000049e000000| Untracked | 0 +| 303|0x000000049e800000, 0x000000049f000000, 0x000000049f000000|100%| O| |TAMS 0x000000049e800000| PB 0x000000049e800000| Untracked | 0 +| 304|0x000000049f000000, 0x000000049f800000, 0x000000049f800000|100%| O| |TAMS 0x000000049f000000| PB 0x000000049f000000| Untracked | 0 +| 305|0x000000049f800000, 0x00000004a0000000, 0x00000004a0000000|100%| O| |TAMS 0x000000049f800000| PB 0x000000049f800000| Untracked | 0 +| 306|0x00000004a0000000, 0x00000004a0800000, 0x00000004a0800000|100%| O| |TAMS 0x00000004a0000000| PB 0x00000004a0000000| Untracked | 0 +| 307|0x00000004a0800000, 0x00000004a1000000, 0x00000004a1000000|100%| O| |TAMS 0x00000004a0800000| PB 0x00000004a0800000| Untracked | 0 +| 308|0x00000004a1000000, 0x00000004a1800000, 0x00000004a1800000|100%| O| |TAMS 0x00000004a1000000| PB 0x00000004a1000000| Untracked | 0 +| 309|0x00000004a1800000, 0x00000004a2000000, 0x00000004a2000000|100%| O| |TAMS 0x00000004a1800000| PB 0x00000004a1800000| Untracked | 0 +| 310|0x00000004a2000000, 0x00000004a2800000, 0x00000004a2800000|100%| O| |TAMS 0x00000004a2000000| PB 0x00000004a2000000| Untracked | 0 +| 311|0x00000004a2800000, 0x00000004a3000000, 0x00000004a3000000|100%| O| |TAMS 0x00000004a2800000| PB 0x00000004a2800000| Untracked | 0 +| 312|0x00000004a3000000, 0x00000004a3800000, 0x00000004a3800000|100%| O| |TAMS 0x00000004a3000000| PB 0x00000004a3000000| Untracked | 0 +| 313|0x00000004a3800000, 0x00000004a4000000, 0x00000004a4000000|100%| O| |TAMS 0x00000004a3800000| PB 0x00000004a3800000| Untracked | 0 +| 314|0x00000004a4000000, 0x00000004a4800000, 0x00000004a4800000|100%| O| |TAMS 0x00000004a4000000| PB 0x00000004a4000000| Untracked | 0 +| 315|0x00000004a4800000, 0x00000004a5000000, 0x00000004a5000000|100%| O| |TAMS 0x00000004a4800000| PB 0x00000004a4800000| Untracked | 0 +| 316|0x00000004a5000000, 0x00000004a5800000, 0x00000004a5800000|100%| O| |TAMS 0x00000004a5000000| PB 0x00000004a5000000| Untracked | 0 +| 317|0x00000004a5800000, 0x00000004a6000000, 0x00000004a6000000|100%| O| |TAMS 0x00000004a5800000| PB 0x00000004a5800000| Untracked | 0 +| 318|0x00000004a6000000, 0x00000004a6800000, 0x00000004a6800000|100%| O| |TAMS 0x00000004a6000000| PB 0x00000004a6000000| Untracked | 0 +| 319|0x00000004a6800000, 0x00000004a7000000, 0x00000004a7000000|100%| O| |TAMS 0x00000004a6800000| PB 0x00000004a6800000| Untracked | 0 +| 320|0x00000004a7000000, 0x00000004a7800000, 0x00000004a7800000|100%| O| |TAMS 0x00000004a7000000| PB 0x00000004a7000000| Untracked | 0 +| 321|0x00000004a7800000, 0x00000004a8000000, 0x00000004a8000000|100%| O| |TAMS 0x00000004a7800000| PB 0x00000004a7800000| Untracked | 0 +| 322|0x00000004a8000000, 0x00000004a8800000, 0x00000004a8800000|100%| O| |TAMS 0x00000004a8000000| PB 0x00000004a8000000| Untracked | 0 +| 323|0x00000004a8800000, 0x00000004a9000000, 0x00000004a9000000|100%| O| |TAMS 0x00000004a8800000| PB 0x00000004a8800000| Untracked | 0 +| 324|0x00000004a9000000, 0x00000004a9800000, 0x00000004a9800000|100%| O| |TAMS 0x00000004a9000000| PB 0x00000004a9000000| Untracked | 0 +| 325|0x00000004a9800000, 0x00000004aa000000, 0x00000004aa000000|100%| O| |TAMS 0x00000004a9800000| PB 0x00000004a9800000| Untracked | 0 +| 326|0x00000004aa000000, 0x00000004aa800000, 0x00000004aa800000|100%| O| |TAMS 0x00000004aa000000| PB 0x00000004aa000000| Untracked | 0 +| 327|0x00000004aa800000, 0x00000004ab000000, 0x00000004ab000000|100%| O| |TAMS 0x00000004aa800000| PB 0x00000004aa800000| Untracked | 0 +| 328|0x00000004ab000000, 0x00000004ab800000, 0x00000004ab800000|100%| O| |TAMS 0x00000004ab000000| PB 0x00000004ab000000| Untracked | 0 +| 329|0x00000004ab800000, 0x00000004ac000000, 0x00000004ac000000|100%| O| |TAMS 0x00000004ab800000| PB 0x00000004ab800000| Untracked | 0 +| 330|0x00000004ac000000, 0x00000004ac800000, 0x00000004ac800000|100%| O| |TAMS 0x00000004ac000000| PB 0x00000004ac000000| Untracked | 0 +| 331|0x00000004ac800000, 0x00000004ad000000, 0x00000004ad000000|100%| O| |TAMS 0x00000004ac800000| PB 0x00000004ac800000| Untracked | 0 +| 332|0x00000004ad000000, 0x00000004ad800000, 0x00000004ad800000|100%| O| |TAMS 0x00000004ad000000| PB 0x00000004ad000000| Untracked | 0 +| 333|0x00000004ad800000, 0x00000004ae000000, 0x00000004ae000000|100%| O| |TAMS 0x00000004ad800000| PB 0x00000004ad800000| Untracked | 0 +| 334|0x00000004ae000000, 0x00000004ae800000, 0x00000004ae800000|100%| O| |TAMS 0x00000004ae000000| PB 0x00000004ae000000| Untracked | 0 +| 335|0x00000004ae800000, 0x00000004af000000, 0x00000004af000000|100%| O| |TAMS 0x00000004ae800000| PB 0x00000004ae800000| Untracked | 0 +| 336|0x00000004af000000, 0x00000004af800000, 0x00000004af800000|100%| O| |TAMS 0x00000004af000000| PB 0x00000004af000000| Untracked | 0 +| 337|0x00000004af800000, 0x00000004b0000000, 0x00000004b0000000|100%| O| |TAMS 0x00000004af800000| PB 0x00000004af800000| Untracked | 0 +| 338|0x00000004b0000000, 0x00000004b0800000, 0x00000004b0800000|100%| O| |TAMS 0x00000004b0000000| PB 0x00000004b0000000| Untracked | 0 +| 339|0x00000004b0800000, 0x00000004b1000000, 0x00000004b1000000|100%| O| |TAMS 0x00000004b0800000| PB 0x00000004b0800000| Untracked | 0 +| 340|0x00000004b1000000, 0x00000004b1800000, 0x00000004b1800000|100%| O| |TAMS 0x00000004b1000000| PB 0x00000004b1000000| Untracked | 0 +| 341|0x00000004b1800000, 0x00000004b2000000, 0x00000004b2000000|100%| O| |TAMS 0x00000004b1800000| PB 0x00000004b1800000| Untracked | 0 +| 342|0x00000004b2000000, 0x00000004b2800000, 0x00000004b2800000|100%| O| |TAMS 0x00000004b2000000| PB 0x00000004b2000000| Untracked | 0 +| 343|0x00000004b2800000, 0x00000004b3000000, 0x00000004b3000000|100%| O| |TAMS 0x00000004b2800000| PB 0x00000004b2800000| Untracked | 0 +| 344|0x00000004b3000000, 0x00000004b3800000, 0x00000004b3800000|100%| O| |TAMS 0x00000004b3000000| PB 0x00000004b3000000| Untracked | 0 +| 345|0x00000004b3800000, 0x00000004b4000000, 0x00000004b4000000|100%| O| |TAMS 0x00000004b3800000| PB 0x00000004b3800000| Untracked | 0 +| 346|0x00000004b4000000, 0x00000004b4800000, 0x00000004b4800000|100%| O| |TAMS 0x00000004b4000000| PB 0x00000004b4000000| Untracked | 0 +| 347|0x00000004b4800000, 0x00000004b5000000, 0x00000004b5000000|100%| O| |TAMS 0x00000004b4800000| PB 0x00000004b4800000| Untracked | 0 +| 348|0x00000004b5000000, 0x00000004b5800000, 0x00000004b5800000|100%| O| |TAMS 0x00000004b5000000| PB 0x00000004b5000000| Untracked | 0 +| 349|0x00000004b5800000, 0x00000004b6000000, 0x00000004b6000000|100%| O| |TAMS 0x00000004b5800000| PB 0x00000004b5800000| Untracked | 0 +| 350|0x00000004b6000000, 0x00000004b6800000, 0x00000004b6800000|100%| O| |TAMS 0x00000004b6000000| PB 0x00000004b6000000| Untracked | 0 +| 351|0x00000004b6800000, 0x00000004b7000000, 0x00000004b7000000|100%| O| |TAMS 0x00000004b6800000| PB 0x00000004b6800000| Untracked | 0 +| 352|0x00000004b7000000, 0x00000004b7800000, 0x00000004b7800000|100%| O| |TAMS 0x00000004b7000000| PB 0x00000004b7000000| Untracked | 0 +| 353|0x00000004b7800000, 0x00000004b8000000, 0x00000004b8000000|100%| O| |TAMS 0x00000004b7800000| PB 0x00000004b7800000| Untracked | 0 +| 354|0x00000004b8000000, 0x00000004b8800000, 0x00000004b8800000|100%| O| |TAMS 0x00000004b8000000| PB 0x00000004b8000000| Untracked | 0 +| 355|0x00000004b8800000, 0x00000004b9000000, 0x00000004b9000000|100%| O| |TAMS 0x00000004b8800000| PB 0x00000004b8800000| Untracked | 0 +| 356|0x00000004b9000000, 0x00000004b9800000, 0x00000004b9800000|100%| O| |TAMS 0x00000004b9000000| PB 0x00000004b9000000| Untracked | 0 +| 357|0x00000004b9800000, 0x00000004ba000000, 0x00000004ba000000|100%| O| |TAMS 0x00000004b9800000| PB 0x00000004b9800000| Untracked | 0 +| 358|0x00000004ba000000, 0x00000004ba800000, 0x00000004ba800000|100%| O| |TAMS 0x00000004ba000000| PB 0x00000004ba000000| Untracked | 0 +| 359|0x00000004ba800000, 0x00000004bb000000, 0x00000004bb000000|100%| O| |TAMS 0x00000004ba800000| PB 0x00000004ba800000| Untracked | 0 +| 360|0x00000004bb000000, 0x00000004bb800000, 0x00000004bb800000|100%| O| |TAMS 0x00000004bb000000| PB 0x00000004bb000000| Untracked | 0 +| 361|0x00000004bb800000, 0x00000004bc000000, 0x00000004bc000000|100%| O| |TAMS 0x00000004bb800000| PB 0x00000004bb800000| Untracked | 0 +| 362|0x00000004bc000000, 0x00000004bc800000, 0x00000004bc800000|100%| O| |TAMS 0x00000004bc000000| PB 0x00000004bc000000| Untracked | 0 +| 363|0x00000004bc800000, 0x00000004bd000000, 0x00000004bd000000|100%| O| |TAMS 0x00000004bc800000| PB 0x00000004bc800000| Untracked | 0 +| 364|0x00000004bd000000, 0x00000004bd800000, 0x00000004bd800000|100%| O| |TAMS 0x00000004bd000000| PB 0x00000004bd000000| Untracked | 0 +| 365|0x00000004bd800000, 0x00000004be000000, 0x00000004be000000|100%| O| |TAMS 0x00000004bd800000| PB 0x00000004bd800000| Untracked | 0 +| 366|0x00000004be000000, 0x00000004be800000, 0x00000004be800000|100%| O| |TAMS 0x00000004be000000| PB 0x00000004be000000| Untracked | 0 +| 367|0x00000004be800000, 0x00000004bf000000, 0x00000004bf000000|100%| O| |TAMS 0x00000004be800000| PB 0x00000004be800000| Untracked | 0 +| 368|0x00000004bf000000, 0x00000004bf800000, 0x00000004bf800000|100%| O| |TAMS 0x00000004bf000000| PB 0x00000004bf000000| Untracked | 0 +| 369|0x00000004bf800000, 0x00000004c0000000, 0x00000004c0000000|100%| O| |TAMS 0x00000004bf800000| PB 0x00000004bf800000| Untracked | 0 +| 370|0x00000004c0000000, 0x00000004c0800000, 0x00000004c0800000|100%| O| |TAMS 0x00000004c0000000| PB 0x00000004c0000000| Untracked | 0 +| 371|0x00000004c0800000, 0x00000004c1000000, 0x00000004c1000000|100%| O| |TAMS 0x00000004c0800000| PB 0x00000004c0800000| Untracked | 0 +| 372|0x00000004c1000000, 0x00000004c1800000, 0x00000004c1800000|100%| O| |TAMS 0x00000004c1000000| PB 0x00000004c1000000| Untracked | 0 +| 373|0x00000004c1800000, 0x00000004c2000000, 0x00000004c2000000|100%| O| |TAMS 0x00000004c1800000| PB 0x00000004c1800000| Untracked | 0 +| 374|0x00000004c2000000, 0x00000004c2800000, 0x00000004c2800000|100%| O| |TAMS 0x00000004c2000000| PB 0x00000004c2000000| Untracked | 0 +| 375|0x00000004c2800000, 0x00000004c3000000, 0x00000004c3000000|100%| O| |TAMS 0x00000004c2800000| PB 0x00000004c2800000| Untracked | 0 +| 376|0x00000004c3000000, 0x00000004c3800000, 0x00000004c3800000|100%| O| |TAMS 0x00000004c3000000| PB 0x00000004c3000000| Untracked | 0 +| 377|0x00000004c3800000, 0x00000004c4000000, 0x00000004c4000000|100%| O| |TAMS 0x00000004c3800000| PB 0x00000004c3800000| Untracked | 0 +| 378|0x00000004c4000000, 0x00000004c4800000, 0x00000004c4800000|100%| O| |TAMS 0x00000004c4000000| PB 0x00000004c4000000| Untracked | 0 +| 379|0x00000004c4800000, 0x00000004c5000000, 0x00000004c5000000|100%| O| |TAMS 0x00000004c4800000| PB 0x00000004c4800000| Untracked | 0 +| 380|0x00000004c5000000, 0x00000004c5800000, 0x00000004c5800000|100%| O| |TAMS 0x00000004c5000000| PB 0x00000004c5000000| Untracked | 0 +| 381|0x00000004c5800000, 0x00000004c6000000, 0x00000004c6000000|100%| O| |TAMS 0x00000004c5800000| PB 0x00000004c5800000| Untracked | 0 +| 382|0x00000004c6000000, 0x00000004c6800000, 0x00000004c6800000|100%| O| |TAMS 0x00000004c6000000| PB 0x00000004c6000000| Untracked | 0 +| 383|0x00000004c6800000, 0x00000004c7000000, 0x00000004c7000000|100%| O| |TAMS 0x00000004c6800000| PB 0x00000004c6800000| Untracked | 0 +| 384|0x00000004c7000000, 0x00000004c7800000, 0x00000004c7800000|100%| O| |TAMS 0x00000004c7000000| PB 0x00000004c7000000| Untracked | 0 +| 385|0x00000004c7800000, 0x00000004c8000000, 0x00000004c8000000|100%| O| |TAMS 0x00000004c7800000| PB 0x00000004c7800000| Untracked | 0 +| 386|0x00000004c8000000, 0x00000004c8800000, 0x00000004c8800000|100%| O| |TAMS 0x00000004c8000000| PB 0x00000004c8000000| Untracked | 0 +| 387|0x00000004c8800000, 0x00000004c9000000, 0x00000004c9000000|100%| O| |TAMS 0x00000004c8800000| PB 0x00000004c8800000| Untracked | 0 +| 388|0x00000004c9000000, 0x00000004c9800000, 0x00000004c9800000|100%| O| |TAMS 0x00000004c9000000| PB 0x00000004c9000000| Untracked | 0 +| 389|0x00000004c9800000, 0x00000004ca000000, 0x00000004ca000000|100%| O| |TAMS 0x00000004c9800000| PB 0x00000004c9800000| Untracked | 0 +| 390|0x00000004ca000000, 0x00000004ca800000, 0x00000004ca800000|100%| O| |TAMS 0x00000004ca000000| PB 0x00000004ca000000| Untracked | 0 +| 391|0x00000004ca800000, 0x00000004cb000000, 0x00000004cb000000|100%| O| |TAMS 0x00000004ca800000| PB 0x00000004ca800000| Untracked | 0 +| 392|0x00000004cb000000, 0x00000004cb800000, 0x00000004cb800000|100%| O| |TAMS 0x00000004cb000000| PB 0x00000004cb000000| Untracked | 0 +| 393|0x00000004cb800000, 0x00000004cc000000, 0x00000004cc000000|100%| O| |TAMS 0x00000004cb800000| PB 0x00000004cb800000| Untracked | 0 +| 394|0x00000004cc000000, 0x00000004cc800000, 0x00000004cc800000|100%| O| |TAMS 0x00000004cc000000| PB 0x00000004cc000000| Untracked | 0 +| 395|0x00000004cc800000, 0x00000004cd000000, 0x00000004cd000000|100%| O| |TAMS 0x00000004cc800000| PB 0x00000004cc800000| Untracked | 0 +| 396|0x00000004cd000000, 0x00000004cd800000, 0x00000004cd800000|100%| O| |TAMS 0x00000004cd000000| PB 0x00000004cd000000| Untracked | 0 +| 397|0x00000004cd800000, 0x00000004ce000000, 0x00000004ce000000|100%| O| |TAMS 0x00000004cd800000| PB 0x00000004cd800000| Untracked | 0 +| 398|0x00000004ce000000, 0x00000004ce800000, 0x00000004ce800000|100%| O| |TAMS 0x00000004ce000000| PB 0x00000004ce000000| Untracked | 0 +| 399|0x00000004ce800000, 0x00000004cf000000, 0x00000004cf000000|100%| O| |TAMS 0x00000004ce800000| PB 0x00000004ce800000| Untracked | 0 +| 400|0x00000004cf000000, 0x00000004cf800000, 0x00000004cf800000|100%| O| |TAMS 0x00000004cf000000| PB 0x00000004cf000000| Untracked | 0 +| 401|0x00000004cf800000, 0x00000004d0000000, 0x00000004d0000000|100%| O| |TAMS 0x00000004cf800000| PB 0x00000004cf800000| Untracked | 0 +| 402|0x00000004d0000000, 0x00000004d0800000, 0x00000004d0800000|100%| O| |TAMS 0x00000004d0000000| PB 0x00000004d0000000| Untracked | 0 +| 403|0x00000004d0800000, 0x00000004d1000000, 0x00000004d1000000|100%| O| |TAMS 0x00000004d0800000| PB 0x00000004d0800000| Untracked | 0 +| 404|0x00000004d1000000, 0x00000004d1800000, 0x00000004d1800000|100%| O| |TAMS 0x00000004d1000000| PB 0x00000004d1000000| Untracked | 0 +| 405|0x00000004d1800000, 0x00000004d2000000, 0x00000004d2000000|100%| O| |TAMS 0x00000004d1800000| PB 0x00000004d1800000| Untracked | 0 +| 406|0x00000004d2000000, 0x00000004d2800000, 0x00000004d2800000|100%| O| |TAMS 0x00000004d2000000| PB 0x00000004d2000000| Untracked | 0 +| 407|0x00000004d2800000, 0x00000004d3000000, 0x00000004d3000000|100%| O| |TAMS 0x00000004d2800000| PB 0x00000004d2800000| Untracked | 0 +| 408|0x00000004d3000000, 0x00000004d3800000, 0x00000004d3800000|100%| O| |TAMS 0x00000004d3000000| PB 0x00000004d3000000| Untracked | 0 +| 409|0x00000004d3800000, 0x00000004d4000000, 0x00000004d4000000|100%| O| |TAMS 0x00000004d3800000| PB 0x00000004d3800000| Untracked | 0 +| 410|0x00000004d4000000, 0x00000004d4800000, 0x00000004d4800000|100%| O| |TAMS 0x00000004d4000000| PB 0x00000004d4000000| Untracked | 0 +| 411|0x00000004d4800000, 0x00000004d5000000, 0x00000004d5000000|100%| O| |TAMS 0x00000004d4800000| PB 0x00000004d4800000| Untracked | 0 +| 412|0x00000004d5000000, 0x00000004d5800000, 0x00000004d5800000|100%| O| |TAMS 0x00000004d5000000| PB 0x00000004d5000000| Untracked | 0 +| 413|0x00000004d5800000, 0x00000004d6000000, 0x00000004d6000000|100%| O| |TAMS 0x00000004d5800000| PB 0x00000004d5800000| Untracked | 0 +| 414|0x00000004d6000000, 0x00000004d6800000, 0x00000004d6800000|100%| O| |TAMS 0x00000004d6000000| PB 0x00000004d6000000| Untracked | 0 +| 415|0x00000004d6800000, 0x00000004d7000000, 0x00000004d7000000|100%| O| |TAMS 0x00000004d6800000| PB 0x00000004d6800000| Untracked | 0 +| 416|0x00000004d7000000, 0x00000004d7800000, 0x00000004d7800000|100%| O| |TAMS 0x00000004d7000000| PB 0x00000004d7000000| Untracked | 0 +| 417|0x00000004d7800000, 0x00000004d8000000, 0x00000004d8000000|100%| O| |TAMS 0x00000004d7800000| PB 0x00000004d7800000| Untracked | 0 +| 418|0x00000004d8000000, 0x00000004d8800000, 0x00000004d8800000|100%| O| |TAMS 0x00000004d8000000| PB 0x00000004d8000000| Untracked | 0 +| 419|0x00000004d8800000, 0x00000004d9000000, 0x00000004d9000000|100%| O| |TAMS 0x00000004d8800000| PB 0x00000004d8800000| Untracked | 0 +| 420|0x00000004d9000000, 0x00000004d9800000, 0x00000004d9800000|100%| O| |TAMS 0x00000004d9000000| PB 0x00000004d9000000| Untracked | 0 +| 421|0x00000004d9800000, 0x00000004da000000, 0x00000004da000000|100%| O| |TAMS 0x00000004d9800000| PB 0x00000004d9800000| Untracked | 0 +| 422|0x00000004da000000, 0x00000004da800000, 0x00000004da800000|100%| O| |TAMS 0x00000004da000000| PB 0x00000004da000000| Untracked | 0 +| 423|0x00000004da800000, 0x00000004db000000, 0x00000004db000000|100%| O| |TAMS 0x00000004da800000| PB 0x00000004da800000| Untracked | 0 +| 424|0x00000004db000000, 0x00000004db800000, 0x00000004db800000|100%| O| |TAMS 0x00000004db000000| PB 0x00000004db000000| Untracked | 0 +| 425|0x00000004db800000, 0x00000004dc000000, 0x00000004dc000000|100%| O| |TAMS 0x00000004db800000| PB 0x00000004db800000| Untracked | 0 +| 426|0x00000004dc000000, 0x00000004dc800000, 0x00000004dc800000|100%| O| |TAMS 0x00000004dc000000| PB 0x00000004dc000000| Untracked | 0 +| 427|0x00000004dc800000, 0x00000004dd000000, 0x00000004dd000000|100%| O| |TAMS 0x00000004dc800000| PB 0x00000004dc800000| Untracked | 0 +| 428|0x00000004dd000000, 0x00000004dd800000, 0x00000004dd800000|100%| O| |TAMS 0x00000004dd000000| PB 0x00000004dd000000| Untracked | 0 +| 429|0x00000004dd800000, 0x00000004de000000, 0x00000004de000000|100%| O| |TAMS 0x00000004dd800000| PB 0x00000004dd800000| Untracked | 0 +| 430|0x00000004de000000, 0x00000004de800000, 0x00000004de800000|100%| O| |TAMS 0x00000004de000000| PB 0x00000004de000000| Untracked | 0 +| 431|0x00000004de800000, 0x00000004df000000, 0x00000004df000000|100%| O| |TAMS 0x00000004de800000| PB 0x00000004de800000| Untracked | 0 +| 432|0x00000004df000000, 0x00000004df800000, 0x00000004df800000|100%| O| |TAMS 0x00000004df000000| PB 0x00000004df000000| Untracked | 0 +| 433|0x00000004df800000, 0x00000004e0000000, 0x00000004e0000000|100%| O| |TAMS 0x00000004df800000| PB 0x00000004df800000| Untracked | 0 +| 434|0x00000004e0000000, 0x00000004e0800000, 0x00000004e0800000|100%| O| |TAMS 0x00000004e0000000| PB 0x00000004e0000000| Untracked | 0 +| 435|0x00000004e0800000, 0x00000004e1000000, 0x00000004e1000000|100%| O| |TAMS 0x00000004e0800000| PB 0x00000004e0800000| Untracked | 0 +| 436|0x00000004e1000000, 0x00000004e1800000, 0x00000004e1800000|100%| O| |TAMS 0x00000004e1000000| PB 0x00000004e1000000| Untracked | 0 +| 437|0x00000004e1800000, 0x00000004e2000000, 0x00000004e2000000|100%| O| |TAMS 0x00000004e1800000| PB 0x00000004e1800000| Untracked | 0 +| 438|0x00000004e2000000, 0x00000004e2800000, 0x00000004e2800000|100%| O| |TAMS 0x00000004e2000000| PB 0x00000004e2000000| Untracked | 0 +| 439|0x00000004e2800000, 0x00000004e3000000, 0x00000004e3000000|100%| O| |TAMS 0x00000004e2800000| PB 0x00000004e2800000| Untracked | 0 +| 440|0x00000004e3000000, 0x00000004e3800000, 0x00000004e3800000|100%| O| |TAMS 0x00000004e3000000| PB 0x00000004e3000000| Untracked | 0 +| 441|0x00000004e3800000, 0x00000004e4000000, 0x00000004e4000000|100%| O| |TAMS 0x00000004e3800000| PB 0x00000004e3800000| Untracked | 0 +| 442|0x00000004e4000000, 0x00000004e4800000, 0x00000004e4800000|100%| O| |TAMS 0x00000004e4000000| PB 0x00000004e4000000| Untracked | 0 +| 443|0x00000004e4800000, 0x00000004e5000000, 0x00000004e5000000|100%| O| |TAMS 0x00000004e4800000| PB 0x00000004e4800000| Untracked | 0 +| 444|0x00000004e5000000, 0x00000004e5800000, 0x00000004e5800000|100%| O| |TAMS 0x00000004e5000000| PB 0x00000004e5000000| Untracked | 0 +| 445|0x00000004e5800000, 0x00000004e6000000, 0x00000004e6000000|100%| O| |TAMS 0x00000004e5800000| PB 0x00000004e5800000| Untracked | 0 +| 446|0x00000004e6000000, 0x00000004e6800000, 0x00000004e6800000|100%| O| |TAMS 0x00000004e6000000| PB 0x00000004e6000000| Untracked | 0 +| 447|0x00000004e6800000, 0x00000004e7000000, 0x00000004e7000000|100%| O| |TAMS 0x00000004e6800000| PB 0x00000004e6800000| Untracked | 0 +| 448|0x00000004e7000000, 0x00000004e7800000, 0x00000004e7800000|100%| O| |TAMS 0x00000004e7000000| PB 0x00000004e7000000| Untracked | 0 +| 449|0x00000004e7800000, 0x00000004e8000000, 0x00000004e8000000|100%| O| |TAMS 0x00000004e7800000| PB 0x00000004e7800000| Untracked | 0 +| 450|0x00000004e8000000, 0x00000004e8800000, 0x00000004e8800000|100%| O| |TAMS 0x00000004e8000000| PB 0x00000004e8000000| Untracked | 0 +| 451|0x00000004e8800000, 0x00000004e9000000, 0x00000004e9000000|100%| O| |TAMS 0x00000004e8800000| PB 0x00000004e8800000| Untracked | 0 +| 452|0x00000004e9000000, 0x00000004e9800000, 0x00000004e9800000|100%| O| |TAMS 0x00000004e9000000| PB 0x00000004e9000000| Untracked | 0 +| 453|0x00000004e9800000, 0x00000004ea000000, 0x00000004ea000000|100%| O| |TAMS 0x00000004e9800000| PB 0x00000004e9800000| Untracked | 0 +| 454|0x00000004ea000000, 0x00000004ea800000, 0x00000004ea800000|100%| O| |TAMS 0x00000004ea000000| PB 0x00000004ea000000| Untracked | 0 +| 455|0x00000004ea800000, 0x00000004eb000000, 0x00000004eb000000|100%| O| |TAMS 0x00000004ea800000| PB 0x00000004ea800000| Untracked | 0 +| 456|0x00000004eb000000, 0x00000004eb800000, 0x00000004eb800000|100%| O| |TAMS 0x00000004eb000000| PB 0x00000004eb000000| Untracked | 0 +| 457|0x00000004eb800000, 0x00000004ec000000, 0x00000004ec000000|100%| O| |TAMS 0x00000004eb800000| PB 0x00000004eb800000| Untracked | 0 +| 458|0x00000004ec000000, 0x00000004ec800000, 0x00000004ec800000|100%| O| |TAMS 0x00000004ec000000| PB 0x00000004ec000000| Untracked | 0 +| 459|0x00000004ec800000, 0x00000004ed000000, 0x00000004ed000000|100%| O| |TAMS 0x00000004ec800000| PB 0x00000004ec800000| Untracked | 0 +| 460|0x00000004ed000000, 0x00000004ed800000, 0x00000004ed800000|100%| O| |TAMS 0x00000004ed000000| PB 0x00000004ed000000| Untracked | 0 +| 461|0x00000004ed800000, 0x00000004ee000000, 0x00000004ee000000|100%| O| |TAMS 0x00000004ed800000| PB 0x00000004ed800000| Untracked | 0 +| 462|0x00000004ee000000, 0x00000004ee800000, 0x00000004ee800000|100%| O| |TAMS 0x00000004ee000000| PB 0x00000004ee000000| Untracked | 0 +| 463|0x00000004ee800000, 0x00000004ef000000, 0x00000004ef000000|100%| O| |TAMS 0x00000004ee800000| PB 0x00000004ee800000| Untracked | 0 +| 464|0x00000004ef000000, 0x00000004ef800000, 0x00000004ef800000|100%| O| |TAMS 0x00000004ef000000| PB 0x00000004ef000000| Untracked | 0 +| 465|0x00000004ef800000, 0x00000004f0000000, 0x00000004f0000000|100%| O| |TAMS 0x00000004ef800000| PB 0x00000004ef800000| Untracked | 0 +| 466|0x00000004f0000000, 0x00000004f0800000, 0x00000004f0800000|100%| O| |TAMS 0x00000004f0000000| PB 0x00000004f0000000| Untracked | 0 +| 467|0x00000004f0800000, 0x00000004f1000000, 0x00000004f1000000|100%| O| |TAMS 0x00000004f0800000| PB 0x00000004f0800000| Untracked | 0 +| 468|0x00000004f1000000, 0x00000004f1800000, 0x00000004f1800000|100%| O| |TAMS 0x00000004f1000000| PB 0x00000004f1000000| Untracked | 0 +| 469|0x00000004f1800000, 0x00000004f2000000, 0x00000004f2000000|100%| O| |TAMS 0x00000004f1800000| PB 0x00000004f1800000| Untracked | 0 +| 470|0x00000004f2000000, 0x00000004f2800000, 0x00000004f2800000|100%| O| |TAMS 0x00000004f2000000| PB 0x00000004f2000000| Untracked | 0 +| 471|0x00000004f2800000, 0x00000004f3000000, 0x00000004f3000000|100%| O| |TAMS 0x00000004f2800000| PB 0x00000004f2800000| Untracked | 0 +| 472|0x00000004f3000000, 0x00000004f3800000, 0x00000004f3800000|100%| O| |TAMS 0x00000004f3000000| PB 0x00000004f3000000| Untracked | 0 +| 473|0x00000004f3800000, 0x00000004f4000000, 0x00000004f4000000|100%| O| |TAMS 0x00000004f3800000| PB 0x00000004f3800000| Untracked | 0 +| 474|0x00000004f4000000, 0x00000004f4800000, 0x00000004f4800000|100%| O| |TAMS 0x00000004f4000000| PB 0x00000004f4000000| Untracked | 0 +| 475|0x00000004f4800000, 0x00000004f5000000, 0x00000004f5000000|100%| O| |TAMS 0x00000004f4800000| PB 0x00000004f4800000| Untracked | 0 +| 476|0x00000004f5000000, 0x00000004f5800000, 0x00000004f5800000|100%| O| |TAMS 0x00000004f5000000| PB 0x00000004f5000000| Untracked | 0 +| 477|0x00000004f5800000, 0x00000004f6000000, 0x00000004f6000000|100%| O| |TAMS 0x00000004f5800000| PB 0x00000004f5800000| Untracked | 0 +| 478|0x00000004f6000000, 0x00000004f6800000, 0x00000004f6800000|100%| O| |TAMS 0x00000004f6000000| PB 0x00000004f6000000| Untracked | 0 +| 479|0x00000004f6800000, 0x00000004f7000000, 0x00000004f7000000|100%| O| |TAMS 0x00000004f6800000| PB 0x00000004f6800000| Untracked | 0 +| 480|0x00000004f7000000, 0x00000004f7800000, 0x00000004f7800000|100%| O| |TAMS 0x00000004f7000000| PB 0x00000004f7000000| Untracked | 0 +| 481|0x00000004f7800000, 0x00000004f8000000, 0x00000004f8000000|100%| O| |TAMS 0x00000004f7800000| PB 0x00000004f7800000| Untracked | 0 +| 482|0x00000004f8000000, 0x00000004f8800000, 0x00000004f8800000|100%| O| |TAMS 0x00000004f8000000| PB 0x00000004f8000000| Untracked | 0 +| 483|0x00000004f8800000, 0x00000004f9000000, 0x00000004f9000000|100%| O| |TAMS 0x00000004f8800000| PB 0x00000004f8800000| Untracked | 0 +| 484|0x00000004f9000000, 0x00000004f9800000, 0x00000004f9800000|100%| O| |TAMS 0x00000004f9000000| PB 0x00000004f9000000| Untracked | 0 +| 485|0x00000004f9800000, 0x00000004fa000000, 0x00000004fa000000|100%| O| |TAMS 0x00000004f9800000| PB 0x00000004f9800000| Untracked | 0 +| 486|0x00000004fa000000, 0x00000004fa800000, 0x00000004fa800000|100%| O| |TAMS 0x00000004fa000000| PB 0x00000004fa000000| Untracked | 0 +| 487|0x00000004fa800000, 0x00000004fb000000, 0x00000004fb000000|100%| O| |TAMS 0x00000004fa800000| PB 0x00000004fa800000| Untracked | 0 +| 488|0x00000004fb000000, 0x00000004fb800000, 0x00000004fb800000|100%| O| |TAMS 0x00000004fb000000| PB 0x00000004fb000000| Untracked | 0 +| 489|0x00000004fb800000, 0x00000004fc000000, 0x00000004fc000000|100%| O| |TAMS 0x00000004fb800000| PB 0x00000004fb800000| Untracked | 0 +| 490|0x00000004fc000000, 0x00000004fc800000, 0x00000004fc800000|100%| O| |TAMS 0x00000004fc000000| PB 0x00000004fc000000| Untracked | 0 +| 491|0x00000004fc800000, 0x00000004fd000000, 0x00000004fd000000|100%| O| |TAMS 0x00000004fc800000| PB 0x00000004fc800000| Untracked | 0 +| 492|0x00000004fd000000, 0x00000004fd800000, 0x00000004fd800000|100%| O| |TAMS 0x00000004fd000000| PB 0x00000004fd000000| Untracked | 0 +| 493|0x00000004fd800000, 0x00000004fe000000, 0x00000004fe000000|100%| O| |TAMS 0x00000004fd800000| PB 0x00000004fd800000| Untracked | 0 +| 494|0x00000004fe000000, 0x00000004fe800000, 0x00000004fe800000|100%| O| |TAMS 0x00000004fe000000| PB 0x00000004fe000000| Untracked | 0 +| 495|0x00000004fe800000, 0x00000004ff000000, 0x00000004ff000000|100%| O| |TAMS 0x00000004fe800000| PB 0x00000004fe800000| Untracked | 0 +| 496|0x00000004ff000000, 0x00000004ff800000, 0x00000004ff800000|100%| O| |TAMS 0x00000004ff000000| PB 0x00000004ff000000| Untracked | 0 +| 497|0x00000004ff800000, 0x0000000500000000, 0x0000000500000000|100%| O| |TAMS 0x00000004ff800000| PB 0x00000004ff800000| Untracked | 0 +| 498|0x0000000500000000, 0x0000000500800000, 0x0000000500800000|100%| O| |TAMS 0x0000000500000000| PB 0x0000000500000000| Untracked | 0 +| 499|0x0000000500800000, 0x0000000501000000, 0x0000000501000000|100%| O| |TAMS 0x0000000500800000| PB 0x0000000500800000| Untracked | 0 +| 500|0x0000000501000000, 0x0000000501800000, 0x0000000501800000|100%| O| |TAMS 0x0000000501000000| PB 0x0000000501000000| Untracked | 0 +| 501|0x0000000501800000, 0x0000000502000000, 0x0000000502000000|100%| O| |TAMS 0x0000000501800000| PB 0x0000000501800000| Untracked | 0 +| 502|0x0000000502000000, 0x0000000502800000, 0x0000000502800000|100%| O| |TAMS 0x0000000502000000| PB 0x0000000502000000| Untracked | 0 +| 503|0x0000000502800000, 0x0000000503000000, 0x0000000503000000|100%| O| |TAMS 0x0000000502800000| PB 0x0000000502800000| Untracked | 0 +| 504|0x0000000503000000, 0x0000000503800000, 0x0000000503800000|100%| O| |TAMS 0x0000000503000000| PB 0x0000000503000000| Untracked | 0 +| 505|0x0000000503800000, 0x0000000504000000, 0x0000000504000000|100%| O| |TAMS 0x0000000503800000| PB 0x0000000503800000| Untracked | 0 +| 506|0x0000000504000000, 0x0000000504800000, 0x0000000504800000|100%| O| |TAMS 0x0000000504000000| PB 0x0000000504000000| Untracked | 0 +| 507|0x0000000504800000, 0x0000000505000000, 0x0000000505000000|100%| O| |TAMS 0x0000000504800000| PB 0x0000000504800000| Untracked | 0 +| 508|0x0000000505000000, 0x0000000505800000, 0x0000000505800000|100%| O| |TAMS 0x0000000505000000| PB 0x0000000505000000| Untracked | 0 +| 509|0x0000000505800000, 0x0000000506000000, 0x0000000506000000|100%| O| |TAMS 0x0000000505800000| PB 0x0000000505800000| Untracked | 0 +| 510|0x0000000506000000, 0x0000000506800000, 0x0000000506800000|100%| O| |TAMS 0x0000000506000000| PB 0x0000000506000000| Untracked | 0 +| 511|0x0000000506800000, 0x0000000507000000, 0x0000000507000000|100%| O| |TAMS 0x0000000506800000| PB 0x0000000506800000| Untracked | 0 +| 512|0x0000000507000000, 0x0000000507800000, 0x0000000507800000|100%| O| |TAMS 0x0000000507000000| PB 0x0000000507000000| Untracked | 0 +| 513|0x0000000507800000, 0x0000000508000000, 0x0000000508000000|100%| O| |TAMS 0x0000000507800000| PB 0x0000000507800000| Untracked | 0 +| 514|0x0000000508000000, 0x0000000508800000, 0x0000000508800000|100%| O| |TAMS 0x0000000508000000| PB 0x0000000508000000| Untracked | 0 +| 515|0x0000000508800000, 0x0000000509000000, 0x0000000509000000|100%| O| |TAMS 0x0000000508800000| PB 0x0000000508800000| Untracked | 0 +| 516|0x0000000509000000, 0x0000000509800000, 0x0000000509800000|100%| O| |TAMS 0x0000000509000000| PB 0x0000000509000000| Untracked | 0 +| 517|0x0000000509800000, 0x000000050a000000, 0x000000050a000000|100%| O| |TAMS 0x0000000509800000| PB 0x0000000509800000| Untracked | 0 +| 518|0x000000050a000000, 0x000000050a800000, 0x000000050a800000|100%| O| |TAMS 0x000000050a000000| PB 0x000000050a000000| Untracked | 0 +| 519|0x000000050a800000, 0x000000050b000000, 0x000000050b000000|100%| O| |TAMS 0x000000050a800000| PB 0x000000050a800000| Untracked | 0 +| 520|0x000000050b000000, 0x000000050b7b5480, 0x000000050b800000| 96%| O| |TAMS 0x000000050b000000| PB 0x000000050b000000| Untracked | 0 +| 521|0x000000050b800000, 0x000000050b800000, 0x000000050c000000| 0%| F| |TAMS 0x000000050b800000| PB 0x000000050b800000| Untracked | 0 +| 522|0x000000050c000000, 0x000000050c000000, 0x000000050c800000| 0%| F| |TAMS 0x000000050c000000| PB 0x000000050c000000| Untracked | 0 +| 523|0x000000050c800000, 0x000000050c800000, 0x000000050d000000| 0%| F| |TAMS 0x000000050c800000| PB 0x000000050c800000| Untracked | 0 +| 524|0x000000050d000000, 0x000000050d000000, 0x000000050d800000| 0%| F| |TAMS 0x000000050d000000| PB 0x000000050d000000| Untracked | 0 +| 525|0x000000050d800000, 0x000000050d800000, 0x000000050e000000| 0%| F| |TAMS 0x000000050d800000| PB 0x000000050d800000| Untracked | 0 +| 526|0x000000050e000000, 0x000000050e000000, 0x000000050e800000| 0%| F| |TAMS 0x000000050e000000| PB 0x000000050e000000| Untracked | 0 +| 527|0x000000050e800000, 0x000000050e800000, 0x000000050f000000| 0%| F| |TAMS 0x000000050e800000| PB 0x000000050e800000| Untracked | 0 +| 528|0x000000050f000000, 0x000000050f000000, 0x000000050f800000| 0%| F| |TAMS 0x000000050f000000| PB 0x000000050f000000| Untracked | 0 +| 529|0x000000050f800000, 0x000000050f800000, 0x0000000510000000| 0%| F| |TAMS 0x000000050f800000| PB 0x000000050f800000| Untracked | 0 +| 530|0x0000000510000000, 0x0000000510000000, 0x0000000510800000| 0%| F| |TAMS 0x0000000510000000| PB 0x0000000510000000| Untracked | 0 +| 531|0x0000000510800000, 0x0000000510800000, 0x0000000511000000| 0%| F| |TAMS 0x0000000510800000| PB 0x0000000510800000| Untracked | 0 +| 532|0x0000000511000000, 0x0000000511000000, 0x0000000511800000| 0%| F| |TAMS 0x0000000511000000| PB 0x0000000511000000| Untracked | 0 +| 533|0x0000000511800000, 0x0000000511800000, 0x0000000512000000| 0%| F| |TAMS 0x0000000511800000| PB 0x0000000511800000| Untracked | 0 +| 534|0x0000000512000000, 0x0000000512000000, 0x0000000512800000| 0%| F| |TAMS 0x0000000512000000| PB 0x0000000512000000| Untracked | 0 +| 535|0x0000000512800000, 0x0000000512800000, 0x0000000513000000| 0%| F| |TAMS 0x0000000512800000| PB 0x0000000512800000| Untracked | 0 +| 536|0x0000000513000000, 0x0000000513000000, 0x0000000513800000| 0%| F| |TAMS 0x0000000513000000| PB 0x0000000513000000| Untracked | 0 +| 537|0x0000000513800000, 0x0000000513800000, 0x0000000514000000| 0%| F| |TAMS 0x0000000513800000| PB 0x0000000513800000| Untracked | 0 +| 538|0x0000000514000000, 0x0000000514000000, 0x0000000514800000| 0%| F| |TAMS 0x0000000514000000| PB 0x0000000514000000| Untracked | 0 +| 539|0x0000000514800000, 0x0000000514800000, 0x0000000515000000| 0%| F| |TAMS 0x0000000514800000| PB 0x0000000514800000| Untracked | 0 +| 540|0x0000000515000000, 0x0000000515000000, 0x0000000515800000| 0%| F| |TAMS 0x0000000515000000| PB 0x0000000515000000| Untracked | 0 +| 541|0x0000000515800000, 0x0000000515800000, 0x0000000516000000| 0%| F| |TAMS 0x0000000515800000| PB 0x0000000515800000| Untracked | 0 +| 542|0x0000000516000000, 0x0000000516000000, 0x0000000516800000| 0%| F| |TAMS 0x0000000516000000| PB 0x0000000516000000| Untracked | 0 +| 543|0x0000000516800000, 0x0000000516800000, 0x0000000517000000| 0%| F| |TAMS 0x0000000516800000| PB 0x0000000516800000| Untracked | 0 +| 544|0x0000000517000000, 0x0000000517000000, 0x0000000517800000| 0%| F| |TAMS 0x0000000517000000| PB 0x0000000517000000| Untracked | 0 +| 545|0x0000000517800000, 0x0000000517800000, 0x0000000518000000| 0%| F| |TAMS 0x0000000517800000| PB 0x0000000517800000| Untracked | 0 +| 546|0x0000000518000000, 0x0000000518000000, 0x0000000518800000| 0%| F| |TAMS 0x0000000518000000| PB 0x0000000518000000| Untracked | 0 +| 547|0x0000000518800000, 0x0000000518800000, 0x0000000519000000| 0%| F| |TAMS 0x0000000518800000| PB 0x0000000518800000| Untracked | 0 +| 548|0x0000000519000000, 0x0000000519000000, 0x0000000519800000| 0%| F| |TAMS 0x0000000519000000| PB 0x0000000519000000| Untracked | 0 +| 549|0x0000000519800000, 0x0000000519800000, 0x000000051a000000| 0%| F| |TAMS 0x0000000519800000| PB 0x0000000519800000| Untracked | 0 +| 550|0x000000051a000000, 0x000000051a000000, 0x000000051a800000| 0%| F| |TAMS 0x000000051a000000| PB 0x000000051a000000| Untracked | 0 +| 551|0x000000051a800000, 0x000000051a800000, 0x000000051b000000| 0%| F| |TAMS 0x000000051a800000| PB 0x000000051a800000| Untracked | 0 +| 552|0x000000051b000000, 0x000000051b000000, 0x000000051b800000| 0%| F| |TAMS 0x000000051b000000| PB 0x000000051b000000| Untracked | 0 +| 553|0x000000051b800000, 0x000000051b800000, 0x000000051c000000| 0%| F| |TAMS 0x000000051b800000| PB 0x000000051b800000| Untracked | 0 +| 554|0x000000051c000000, 0x000000051c000000, 0x000000051c800000| 0%| F| |TAMS 0x000000051c000000| PB 0x000000051c000000| Untracked | 0 +| 555|0x000000051c800000, 0x000000051c800000, 0x000000051d000000| 0%| F| |TAMS 0x000000051c800000| PB 0x000000051c800000| Untracked | 0 +| 556|0x000000051d000000, 0x000000051d000000, 0x000000051d800000| 0%| F| |TAMS 0x000000051d000000| PB 0x000000051d000000| Untracked | 0 +| 557|0x000000051d800000, 0x000000051d800000, 0x000000051e000000| 0%| F| |TAMS 0x000000051d800000| PB 0x000000051d800000| Untracked | 0 +| 558|0x000000051e000000, 0x000000051e000000, 0x000000051e800000| 0%| F| |TAMS 0x000000051e000000| PB 0x000000051e000000| Untracked | 0 +| 559|0x000000051e800000, 0x000000051e800000, 0x000000051f000000| 0%| F| |TAMS 0x000000051e800000| PB 0x000000051e800000| Untracked | 0 +| 560|0x000000051f000000, 0x000000051f000000, 0x000000051f800000| 0%| F| |TAMS 0x000000051f000000| PB 0x000000051f000000| Untracked | 0 +| 561|0x000000051f800000, 0x000000051f800000, 0x0000000520000000| 0%| F| |TAMS 0x000000051f800000| PB 0x000000051f800000| Untracked | 0 +| 562|0x0000000520000000, 0x0000000520000000, 0x0000000520800000| 0%| F| |TAMS 0x0000000520000000| PB 0x0000000520000000| Untracked | 0 +| 563|0x0000000520800000, 0x0000000520800000, 0x0000000521000000| 0%| F| |TAMS 0x0000000520800000| PB 0x0000000520800000| Untracked | 0 +| 564|0x0000000521000000, 0x0000000521000000, 0x0000000521800000| 0%| F| |TAMS 0x0000000521000000| PB 0x0000000521000000| Untracked | 0 +| 565|0x0000000521800000, 0x0000000521800000, 0x0000000522000000| 0%| F| |TAMS 0x0000000521800000| PB 0x0000000521800000| Untracked | 0 +| 566|0x0000000522000000, 0x0000000522000000, 0x0000000522800000| 0%| F| |TAMS 0x0000000522000000| PB 0x0000000522000000| Untracked | 0 +| 567|0x0000000522800000, 0x0000000522800000, 0x0000000523000000| 0%| F| |TAMS 0x0000000522800000| PB 0x0000000522800000| Untracked | 0 +| 568|0x0000000523000000, 0x0000000523000000, 0x0000000523800000| 0%| F| |TAMS 0x0000000523000000| PB 0x0000000523000000| Untracked | 0 +| 569|0x0000000523800000, 0x0000000523800000, 0x0000000524000000| 0%| F| |TAMS 0x0000000523800000| PB 0x0000000523800000| Untracked | 0 +| 570|0x0000000524000000, 0x0000000524000000, 0x0000000524800000| 0%| F| |TAMS 0x0000000524000000| PB 0x0000000524000000| Untracked | 0 +| 571|0x0000000524800000, 0x0000000524800000, 0x0000000525000000| 0%| F| |TAMS 0x0000000524800000| PB 0x0000000524800000| Untracked | 0 +| 572|0x0000000525000000, 0x0000000525000000, 0x0000000525800000| 0%| F| |TAMS 0x0000000525000000| PB 0x0000000525000000| Untracked | 0 +| 573|0x0000000525800000, 0x0000000525800000, 0x0000000526000000| 0%| F| |TAMS 0x0000000525800000| PB 0x0000000525800000| Untracked | 0 +| 574|0x0000000526000000, 0x0000000526000000, 0x0000000526800000| 0%| F| |TAMS 0x0000000526000000| PB 0x0000000526000000| Untracked | 0 +| 575|0x0000000526800000, 0x0000000526800000, 0x0000000527000000| 0%| F| |TAMS 0x0000000526800000| PB 0x0000000526800000| Untracked | 0 +| 576|0x0000000527000000, 0x0000000527000000, 0x0000000527800000| 0%| F| |TAMS 0x0000000527000000| PB 0x0000000527000000| Untracked | 0 +| 577|0x0000000527800000, 0x0000000527800000, 0x0000000528000000| 0%| F| |TAMS 0x0000000527800000| PB 0x0000000527800000| Untracked | 0 +| 578|0x0000000528000000, 0x0000000528000000, 0x0000000528800000| 0%| F| |TAMS 0x0000000528000000| PB 0x0000000528000000| Untracked | 0 +| 579|0x0000000528800000, 0x0000000528800000, 0x0000000529000000| 0%| F| |TAMS 0x0000000528800000| PB 0x0000000528800000| Untracked | 0 +| 580|0x0000000529000000, 0x0000000529000000, 0x0000000529800000| 0%| F| |TAMS 0x0000000529000000| PB 0x0000000529000000| Untracked | 0 +| 581|0x0000000529800000, 0x0000000529800000, 0x000000052a000000| 0%| F| |TAMS 0x0000000529800000| PB 0x0000000529800000| Untracked | 0 +| 582|0x000000052a000000, 0x000000052a000000, 0x000000052a800000| 0%| F| |TAMS 0x000000052a000000| PB 0x000000052a000000| Untracked | 0 +| 583|0x000000052a800000, 0x000000052a800000, 0x000000052b000000| 0%| F| |TAMS 0x000000052a800000| PB 0x000000052a800000| Untracked | 0 +| 584|0x000000052b000000, 0x000000052b000000, 0x000000052b800000| 0%| F| |TAMS 0x000000052b000000| PB 0x000000052b000000| Untracked | 0 +| 585|0x000000052b800000, 0x000000052b800000, 0x000000052c000000| 0%| F| |TAMS 0x000000052b800000| PB 0x000000052b800000| Untracked | 0 +| 586|0x000000052c000000, 0x000000052c000000, 0x000000052c800000| 0%| F| |TAMS 0x000000052c000000| PB 0x000000052c000000| Untracked | 0 +| 587|0x000000052c800000, 0x000000052c800000, 0x000000052d000000| 0%| F| |TAMS 0x000000052c800000| PB 0x000000052c800000| Untracked | 0 +| 588|0x000000052d000000, 0x000000052d000000, 0x000000052d800000| 0%| F| |TAMS 0x000000052d000000| PB 0x000000052d000000| Untracked | 0 +| 589|0x000000052d800000, 0x000000052d800000, 0x000000052e000000| 0%| F| |TAMS 0x000000052d800000| PB 0x000000052d800000| Untracked | 0 +| 590|0x000000052e000000, 0x000000052e000000, 0x000000052e800000| 0%| F| |TAMS 0x000000052e000000| PB 0x000000052e000000| Untracked | 0 +| 591|0x000000052e800000, 0x000000052e800000, 0x000000052f000000| 0%| F| |TAMS 0x000000052e800000| PB 0x000000052e800000| Untracked | 0 +| 592|0x000000052f000000, 0x000000052f000000, 0x000000052f800000| 0%| F| |TAMS 0x000000052f000000| PB 0x000000052f000000| Untracked | 0 +| 593|0x000000052f800000, 0x000000052f800000, 0x0000000530000000| 0%| F| |TAMS 0x000000052f800000| PB 0x000000052f800000| Untracked | 0 +| 594|0x0000000530000000, 0x0000000530000000, 0x0000000530800000| 0%| F| |TAMS 0x0000000530000000| PB 0x0000000530000000| Untracked | 0 +| 595|0x0000000530800000, 0x0000000530800000, 0x0000000531000000| 0%| F| |TAMS 0x0000000530800000| PB 0x0000000530800000| Untracked | 0 +| 596|0x0000000531000000, 0x0000000531000000, 0x0000000531800000| 0%| F| |TAMS 0x0000000531000000| PB 0x0000000531000000| Untracked | 0 +| 597|0x0000000531800000, 0x0000000531800000, 0x0000000532000000| 0%| F| |TAMS 0x0000000531800000| PB 0x0000000531800000| Untracked | 0 +| 598|0x0000000532000000, 0x0000000532000000, 0x0000000532800000| 0%| F| |TAMS 0x0000000532000000| PB 0x0000000532000000| Untracked | 0 +| 599|0x0000000532800000, 0x0000000532800000, 0x0000000533000000| 0%| F| |TAMS 0x0000000532800000| PB 0x0000000532800000| Untracked | 0 +| 600|0x0000000533000000, 0x0000000533000000, 0x0000000533800000| 0%| F| |TAMS 0x0000000533000000| PB 0x0000000533000000| Untracked | 0 +| 601|0x0000000533800000, 0x0000000533800000, 0x0000000534000000| 0%| F| |TAMS 0x0000000533800000| PB 0x0000000533800000| Untracked | 0 +| 602|0x0000000534000000, 0x0000000534000000, 0x0000000534800000| 0%| F| |TAMS 0x0000000534000000| PB 0x0000000534000000| Untracked | 0 +| 603|0x0000000534800000, 0x0000000534800000, 0x0000000535000000| 0%| F| |TAMS 0x0000000534800000| PB 0x0000000534800000| Untracked | 0 +| 604|0x0000000535000000, 0x0000000535000000, 0x0000000535800000| 0%| F| |TAMS 0x0000000535000000| PB 0x0000000535000000| Untracked | 0 +| 605|0x0000000535800000, 0x0000000535800000, 0x0000000536000000| 0%| F| |TAMS 0x0000000535800000| PB 0x0000000535800000| Untracked | 0 +| 606|0x0000000536000000, 0x0000000536000000, 0x0000000536800000| 0%| F| |TAMS 0x0000000536000000| PB 0x0000000536000000| Untracked | 0 +| 607|0x0000000536800000, 0x0000000536800000, 0x0000000537000000| 0%| F| |TAMS 0x0000000536800000| PB 0x0000000536800000| Untracked | 0 +| 608|0x0000000537000000, 0x0000000537000000, 0x0000000537800000| 0%| F| |TAMS 0x0000000537000000| PB 0x0000000537000000| Untracked | 0 +| 609|0x0000000537800000, 0x0000000537800000, 0x0000000538000000| 0%| F| |TAMS 0x0000000537800000| PB 0x0000000537800000| Untracked | 0 +| 610|0x0000000538000000, 0x0000000538000000, 0x0000000538800000| 0%| F| |TAMS 0x0000000538000000| PB 0x0000000538000000| Untracked | 0 +| 611|0x0000000538800000, 0x0000000538800000, 0x0000000539000000| 0%| F| |TAMS 0x0000000538800000| PB 0x0000000538800000| Untracked | 0 +| 612|0x0000000539000000, 0x0000000539000000, 0x0000000539800000| 0%| F| |TAMS 0x0000000539000000| PB 0x0000000539000000| Untracked | 0 +| 613|0x0000000539800000, 0x0000000539800000, 0x000000053a000000| 0%| F| |TAMS 0x0000000539800000| PB 0x0000000539800000| Untracked | 0 +| 614|0x000000053a000000, 0x000000053a000000, 0x000000053a800000| 0%| F| |TAMS 0x000000053a000000| PB 0x000000053a000000| Untracked | 0 +| 615|0x000000053a800000, 0x000000053a800000, 0x000000053b000000| 0%| F| |TAMS 0x000000053a800000| PB 0x000000053a800000| Untracked | 0 +| 616|0x000000053b000000, 0x000000053b000000, 0x000000053b800000| 0%| F| |TAMS 0x000000053b000000| PB 0x000000053b000000| Untracked | 0 +| 617|0x000000053b800000, 0x000000053b800000, 0x000000053c000000| 0%| F| |TAMS 0x000000053b800000| PB 0x000000053b800000| Untracked | 0 +| 618|0x000000053c000000, 0x000000053c000000, 0x000000053c800000| 0%| F| |TAMS 0x000000053c000000| PB 0x000000053c000000| Untracked | 0 +| 619|0x000000053c800000, 0x000000053c800000, 0x000000053d000000| 0%| F| |TAMS 0x000000053c800000| PB 0x000000053c800000| Untracked | 0 +| 620|0x000000053d000000, 0x000000053d000000, 0x000000053d800000| 0%| F| |TAMS 0x000000053d000000| PB 0x000000053d000000| Untracked | 0 +| 621|0x000000053d800000, 0x000000053d800000, 0x000000053e000000| 0%| F| |TAMS 0x000000053d800000| PB 0x000000053d800000| Untracked | 0 +| 622|0x000000053e000000, 0x000000053e000000, 0x000000053e800000| 0%| F| |TAMS 0x000000053e000000| PB 0x000000053e000000| Untracked | 0 +| 623|0x000000053e800000, 0x000000053e800000, 0x000000053f000000| 0%| F| |TAMS 0x000000053e800000| PB 0x000000053e800000| Untracked | 0 +| 624|0x000000053f000000, 0x000000053f000000, 0x000000053f800000| 0%| F| |TAMS 0x000000053f000000| PB 0x000000053f000000| Untracked | 0 +| 625|0x000000053f800000, 0x000000053f800000, 0x0000000540000000| 0%| F| |TAMS 0x000000053f800000| PB 0x000000053f800000| Untracked | 0 +| 626|0x0000000540000000, 0x0000000540000000, 0x0000000540800000| 0%| F| |TAMS 0x0000000540000000| PB 0x0000000540000000| Untracked | 0 +| 627|0x0000000540800000, 0x0000000540800000, 0x0000000541000000| 0%| F| |TAMS 0x0000000540800000| PB 0x0000000540800000| Untracked | 0 +| 628|0x0000000541000000, 0x0000000541000000, 0x0000000541800000| 0%| F| |TAMS 0x0000000541000000| PB 0x0000000541000000| Untracked | 0 +| 629|0x0000000541800000, 0x0000000541800000, 0x0000000542000000| 0%| F| |TAMS 0x0000000541800000| PB 0x0000000541800000| Untracked | 0 +| 630|0x0000000542000000, 0x0000000542000000, 0x0000000542800000| 0%| F| |TAMS 0x0000000542000000| PB 0x0000000542000000| Untracked | 0 +| 631|0x0000000542800000, 0x0000000542800000, 0x0000000543000000| 0%| F| |TAMS 0x0000000542800000| PB 0x0000000542800000| Untracked | 0 +| 632|0x0000000543000000, 0x0000000543000000, 0x0000000543800000| 0%| F| |TAMS 0x0000000543000000| PB 0x0000000543000000| Untracked | 0 +| 633|0x0000000543800000, 0x0000000543800000, 0x0000000544000000| 0%| F| |TAMS 0x0000000543800000| PB 0x0000000543800000| Untracked | 0 +| 634|0x0000000544000000, 0x0000000544000000, 0x0000000544800000| 0%| F| |TAMS 0x0000000544000000| PB 0x0000000544000000| Untracked | 0 +| 635|0x0000000544800000, 0x0000000544800000, 0x0000000545000000| 0%| F| |TAMS 0x0000000544800000| PB 0x0000000544800000| Untracked | 0 +| 636|0x0000000545000000, 0x0000000545000000, 0x0000000545800000| 0%| F| |TAMS 0x0000000545000000| PB 0x0000000545000000| Untracked | 0 +| 637|0x0000000545800000, 0x0000000545800000, 0x0000000546000000| 0%| F| |TAMS 0x0000000545800000| PB 0x0000000545800000| Untracked | 0 +| 638|0x0000000546000000, 0x0000000546000000, 0x0000000546800000| 0%| F| |TAMS 0x0000000546000000| PB 0x0000000546000000| Untracked | 0 +| 639|0x0000000546800000, 0x0000000546800000, 0x0000000547000000| 0%| F| |TAMS 0x0000000546800000| PB 0x0000000546800000| Untracked | 0 +| 640|0x0000000547000000, 0x0000000547000000, 0x0000000547800000| 0%| F| |TAMS 0x0000000547000000| PB 0x0000000547000000| Untracked | 0 +| 641|0x0000000547800000, 0x0000000547800000, 0x0000000548000000| 0%| F| |TAMS 0x0000000547800000| PB 0x0000000547800000| Untracked | 0 +| 642|0x0000000548000000, 0x0000000548000000, 0x0000000548800000| 0%| F| |TAMS 0x0000000548000000| PB 0x0000000548000000| Untracked | 0 +| 643|0x0000000548800000, 0x0000000548800000, 0x0000000549000000| 0%| F| |TAMS 0x0000000548800000| PB 0x0000000548800000| Untracked | 0 +| 644|0x0000000549000000, 0x0000000549000000, 0x0000000549800000| 0%| F| |TAMS 0x0000000549000000| PB 0x0000000549000000| Untracked | 0 +| 645|0x0000000549800000, 0x0000000549800000, 0x000000054a000000| 0%| F| |TAMS 0x0000000549800000| PB 0x0000000549800000| Untracked | 0 +| 646|0x000000054a000000, 0x000000054a000000, 0x000000054a800000| 0%| F| |TAMS 0x000000054a000000| PB 0x000000054a000000| Untracked | 0 +| 647|0x000000054a800000, 0x000000054a800000, 0x000000054b000000| 0%| F| |TAMS 0x000000054a800000| PB 0x000000054a800000| Untracked | 0 +| 648|0x000000054b000000, 0x000000054b000000, 0x000000054b800000| 0%| F| |TAMS 0x000000054b000000| PB 0x000000054b000000| Untracked | 0 +| 649|0x000000054b800000, 0x000000054b800000, 0x000000054c000000| 0%| F| |TAMS 0x000000054b800000| PB 0x000000054b800000| Untracked | 0 +| 650|0x000000054c000000, 0x000000054c000000, 0x000000054c800000| 0%| F| |TAMS 0x000000054c000000| PB 0x000000054c000000| Untracked | 0 +| 651|0x000000054c800000, 0x000000054c800000, 0x000000054d000000| 0%| F| |TAMS 0x000000054c800000| PB 0x000000054c800000| Untracked | 0 +| 652|0x000000054d000000, 0x000000054d000000, 0x000000054d800000| 0%| F| |TAMS 0x000000054d000000| PB 0x000000054d000000| Untracked | 0 +| 653|0x000000054d800000, 0x000000054d800000, 0x000000054e000000| 0%| F| |TAMS 0x000000054d800000| PB 0x000000054d800000| Untracked | 0 +| 654|0x000000054e000000, 0x000000054e000000, 0x000000054e800000| 0%| F| |TAMS 0x000000054e000000| PB 0x000000054e000000| Untracked | 0 +| 655|0x000000054e800000, 0x000000054e800000, 0x000000054f000000| 0%| F| |TAMS 0x000000054e800000| PB 0x000000054e800000| Untracked | 0 +| 656|0x000000054f000000, 0x000000054f000000, 0x000000054f800000| 0%| F| |TAMS 0x000000054f000000| PB 0x000000054f000000| Untracked | 0 +| 657|0x000000054f800000, 0x000000054f800000, 0x0000000550000000| 0%| F| |TAMS 0x000000054f800000| PB 0x000000054f800000| Untracked | 0 +| 658|0x0000000550000000, 0x0000000550000000, 0x0000000550800000| 0%| F| |TAMS 0x0000000550000000| PB 0x0000000550000000| Untracked | 0 +| 659|0x0000000550800000, 0x0000000550800000, 0x0000000551000000| 0%| F| |TAMS 0x0000000550800000| PB 0x0000000550800000| Untracked | 0 +| 660|0x0000000551000000, 0x0000000551000000, 0x0000000551800000| 0%| F| |TAMS 0x0000000551000000| PB 0x0000000551000000| Untracked | 0 +| 661|0x0000000551800000, 0x0000000551800000, 0x0000000552000000| 0%| F| |TAMS 0x0000000551800000| PB 0x0000000551800000| Untracked | 0 +| 662|0x0000000552000000, 0x0000000552000000, 0x0000000552800000| 0%| F| |TAMS 0x0000000552000000| PB 0x0000000552000000| Untracked | 0 +| 663|0x0000000552800000, 0x0000000552800000, 0x0000000553000000| 0%| F| |TAMS 0x0000000552800000| PB 0x0000000552800000| Untracked | 0 +| 664|0x0000000553000000, 0x0000000553000000, 0x0000000553800000| 0%| F| |TAMS 0x0000000553000000| PB 0x0000000553000000| Untracked | 0 +| 665|0x0000000553800000, 0x0000000553800000, 0x0000000554000000| 0%| F| |TAMS 0x0000000553800000| PB 0x0000000553800000| Untracked | 0 +| 666|0x0000000554000000, 0x0000000554000000, 0x0000000554800000| 0%| F| |TAMS 0x0000000554000000| PB 0x0000000554000000| Untracked | 0 +| 667|0x0000000554800000, 0x0000000554800000, 0x0000000555000000| 0%| F| |TAMS 0x0000000554800000| PB 0x0000000554800000| Untracked | 0 +| 668|0x0000000555000000, 0x0000000555000000, 0x0000000555800000| 0%| F| |TAMS 0x0000000555000000| PB 0x0000000555000000| Untracked | 0 +| 669|0x0000000555800000, 0x0000000555800000, 0x0000000556000000| 0%| F| |TAMS 0x0000000555800000| PB 0x0000000555800000| Untracked | 0 +| 670|0x0000000556000000, 0x0000000556000000, 0x0000000556800000| 0%| F| |TAMS 0x0000000556000000| PB 0x0000000556000000| Untracked | 0 +| 671|0x0000000556800000, 0x0000000556800000, 0x0000000557000000| 0%| F| |TAMS 0x0000000556800000| PB 0x0000000556800000| Untracked | 0 +| 672|0x0000000557000000, 0x0000000557000000, 0x0000000557800000| 0%| F| |TAMS 0x0000000557000000| PB 0x0000000557000000| Untracked | 0 +| 673|0x0000000557800000, 0x0000000557800000, 0x0000000558000000| 0%| F| |TAMS 0x0000000557800000| PB 0x0000000557800000| Untracked | 0 +| 674|0x0000000558000000, 0x0000000558000000, 0x0000000558800000| 0%| F| |TAMS 0x0000000558000000| PB 0x0000000558000000| Untracked | 0 +| 675|0x0000000558800000, 0x0000000558800000, 0x0000000559000000| 0%| F| |TAMS 0x0000000558800000| PB 0x0000000558800000| Untracked | 0 +| 676|0x0000000559000000, 0x0000000559000000, 0x0000000559800000| 0%| F| |TAMS 0x0000000559000000| PB 0x0000000559000000| Untracked | 0 +| 677|0x0000000559800000, 0x0000000559800000, 0x000000055a000000| 0%| F| |TAMS 0x0000000559800000| PB 0x0000000559800000| Untracked | 0 +| 678|0x000000055a000000, 0x000000055a000000, 0x000000055a800000| 0%| F| |TAMS 0x000000055a000000| PB 0x000000055a000000| Untracked | 0 +| 679|0x000000055a800000, 0x000000055a800000, 0x000000055b000000| 0%| F| |TAMS 0x000000055a800000| PB 0x000000055a800000| Untracked | 0 +| 680|0x000000055b000000, 0x000000055b000000, 0x000000055b800000| 0%| F| |TAMS 0x000000055b000000| PB 0x000000055b000000| Untracked | 0 +| 681|0x000000055b800000, 0x000000055b800000, 0x000000055c000000| 0%| F| |TAMS 0x000000055b800000| PB 0x000000055b800000| Untracked | 0 +| 682|0x000000055c000000, 0x000000055c000000, 0x000000055c800000| 0%| F| |TAMS 0x000000055c000000| PB 0x000000055c000000| Untracked | 0 +| 683|0x000000055c800000, 0x000000055c800000, 0x000000055d000000| 0%| F| |TAMS 0x000000055c800000| PB 0x000000055c800000| Untracked | 0 +| 684|0x000000055d000000, 0x000000055d000000, 0x000000055d800000| 0%| F| |TAMS 0x000000055d000000| PB 0x000000055d000000| Untracked | 0 +| 685|0x000000055d800000, 0x000000055d800000, 0x000000055e000000| 0%| F| |TAMS 0x000000055d800000| PB 0x000000055d800000| Untracked | 0 +| 686|0x000000055e000000, 0x000000055e000000, 0x000000055e800000| 0%| F| |TAMS 0x000000055e000000| PB 0x000000055e000000| Untracked | 0 +| 687|0x000000055e800000, 0x000000055e800000, 0x000000055f000000| 0%| F| |TAMS 0x000000055e800000| PB 0x000000055e800000| Untracked | 0 +| 688|0x000000055f000000, 0x000000055f000000, 0x000000055f800000| 0%| F| |TAMS 0x000000055f000000| PB 0x000000055f000000| Untracked | 0 +| 689|0x000000055f800000, 0x000000055f800000, 0x0000000560000000| 0%| F| |TAMS 0x000000055f800000| PB 0x000000055f800000| Untracked | 0 +| 690|0x0000000560000000, 0x0000000560000000, 0x0000000560800000| 0%| F| |TAMS 0x0000000560000000| PB 0x0000000560000000| Untracked | 0 +| 691|0x0000000560800000, 0x0000000560800000, 0x0000000561000000| 0%| F| |TAMS 0x0000000560800000| PB 0x0000000560800000| Untracked | 0 +| 692|0x0000000561000000, 0x0000000561000000, 0x0000000561800000| 0%| F| |TAMS 0x0000000561000000| PB 0x0000000561000000| Untracked | 0 +| 693|0x0000000561800000, 0x0000000561800000, 0x0000000562000000| 0%| F| |TAMS 0x0000000561800000| PB 0x0000000561800000| Untracked | 0 +| 694|0x0000000562000000, 0x0000000562000000, 0x0000000562800000| 0%| F| |TAMS 0x0000000562000000| PB 0x0000000562000000| Untracked | 0 +| 695|0x0000000562800000, 0x0000000562800000, 0x0000000563000000| 0%| F| |TAMS 0x0000000562800000| PB 0x0000000562800000| Untracked | 0 +| 696|0x0000000563000000, 0x0000000563000000, 0x0000000563800000| 0%| F| |TAMS 0x0000000563000000| PB 0x0000000563000000| Untracked | 0 +| 697|0x0000000563800000, 0x0000000563800000, 0x0000000564000000| 0%| F| |TAMS 0x0000000563800000| PB 0x0000000563800000| Untracked | 0 +| 698|0x0000000564000000, 0x0000000564000000, 0x0000000564800000| 0%| F| |TAMS 0x0000000564000000| PB 0x0000000564000000| Untracked | 0 +| 699|0x0000000564800000, 0x0000000564800000, 0x0000000565000000| 0%| F| |TAMS 0x0000000564800000| PB 0x0000000564800000| Untracked | 0 +| 700|0x0000000565000000, 0x0000000565000000, 0x0000000565800000| 0%| F| |TAMS 0x0000000565000000| PB 0x0000000565000000| Untracked | 0 +| 701|0x0000000565800000, 0x0000000565800000, 0x0000000566000000| 0%| F| |TAMS 0x0000000565800000| PB 0x0000000565800000| Untracked | 0 +| 702|0x0000000566000000, 0x0000000566000000, 0x0000000566800000| 0%| F| |TAMS 0x0000000566000000| PB 0x0000000566000000| Untracked | 0 +| 703|0x0000000566800000, 0x0000000566800000, 0x0000000567000000| 0%| F| |TAMS 0x0000000566800000| PB 0x0000000566800000| Untracked | 0 +| 704|0x0000000567000000, 0x0000000567000000, 0x0000000567800000| 0%| F| |TAMS 0x0000000567000000| PB 0x0000000567000000| Untracked | 0 +| 705|0x0000000567800000, 0x0000000567800000, 0x0000000568000000| 0%| F| |TAMS 0x0000000567800000| PB 0x0000000567800000| Untracked | 0 +| 706|0x0000000568000000, 0x0000000568000000, 0x0000000568800000| 0%| F| |TAMS 0x0000000568000000| PB 0x0000000568000000| Untracked | 0 +| 707|0x0000000568800000, 0x0000000568800000, 0x0000000569000000| 0%| F| |TAMS 0x0000000568800000| PB 0x0000000568800000| Untracked | 0 +| 708|0x0000000569000000, 0x0000000569000000, 0x0000000569800000| 0%| F| |TAMS 0x0000000569000000| PB 0x0000000569000000| Untracked | 0 +| 709|0x0000000569800000, 0x0000000569800000, 0x000000056a000000| 0%| F| |TAMS 0x0000000569800000| PB 0x0000000569800000| Untracked | 0 +| 710|0x000000056a000000, 0x000000056a000000, 0x000000056a800000| 0%| F| |TAMS 0x000000056a000000| PB 0x000000056a000000| Untracked | 0 +| 711|0x000000056a800000, 0x000000056a800000, 0x000000056b000000| 0%| F| |TAMS 0x000000056a800000| PB 0x000000056a800000| Untracked | 0 +| 712|0x000000056b000000, 0x000000056b000000, 0x000000056b800000| 0%| F| |TAMS 0x000000056b000000| PB 0x000000056b000000| Untracked | 0 +| 713|0x000000056b800000, 0x000000056b800000, 0x000000056c000000| 0%| F| |TAMS 0x000000056b800000| PB 0x000000056b800000| Untracked | 0 +| 714|0x000000056c000000, 0x000000056c000000, 0x000000056c800000| 0%| F| |TAMS 0x000000056c000000| PB 0x000000056c000000| Untracked | 0 +| 715|0x000000056c800000, 0x000000056c800000, 0x000000056d000000| 0%| F| |TAMS 0x000000056c800000| PB 0x000000056c800000| Untracked | 0 +| 716|0x000000056d000000, 0x000000056d000000, 0x000000056d800000| 0%| F| |TAMS 0x000000056d000000| PB 0x000000056d000000| Untracked | 0 +| 717|0x000000056d800000, 0x000000056d800000, 0x000000056e000000| 0%| F| |TAMS 0x000000056d800000| PB 0x000000056d800000| Untracked | 0 +| 718|0x000000056e000000, 0x000000056e000000, 0x000000056e800000| 0%| F| |TAMS 0x000000056e000000| PB 0x000000056e000000| Untracked | 0 +| 719|0x000000056e800000, 0x000000056e800000, 0x000000056f000000| 0%| F| |TAMS 0x000000056e800000| PB 0x000000056e800000| Untracked | 0 +| 720|0x000000056f000000, 0x000000056f000000, 0x000000056f800000| 0%| F| |TAMS 0x000000056f000000| PB 0x000000056f000000| Untracked | 0 +| 721|0x000000056f800000, 0x000000056f800000, 0x0000000570000000| 0%| F| |TAMS 0x000000056f800000| PB 0x000000056f800000| Untracked | 0 +| 722|0x0000000570000000, 0x0000000570000000, 0x0000000570800000| 0%| F| |TAMS 0x0000000570000000| PB 0x0000000570000000| Untracked | 0 +| 723|0x0000000570800000, 0x0000000570800000, 0x0000000571000000| 0%| F| |TAMS 0x0000000570800000| PB 0x0000000570800000| Untracked | 0 +| 724|0x0000000571000000, 0x0000000571000000, 0x0000000571800000| 0%| F| |TAMS 0x0000000571000000| PB 0x0000000571000000| Untracked | 0 +| 725|0x0000000571800000, 0x0000000571800000, 0x0000000572000000| 0%| F| |TAMS 0x0000000571800000| PB 0x0000000571800000| Untracked | 0 +| 726|0x0000000572000000, 0x0000000572000000, 0x0000000572800000| 0%| F| |TAMS 0x0000000572000000| PB 0x0000000572000000| Untracked | 0 +| 727|0x0000000572800000, 0x0000000572800000, 0x0000000573000000| 0%| F| |TAMS 0x0000000572800000| PB 0x0000000572800000| Untracked | 0 +| 728|0x0000000573000000, 0x0000000573000000, 0x0000000573800000| 0%| F| |TAMS 0x0000000573000000| PB 0x0000000573000000| Untracked | 0 +| 729|0x0000000573800000, 0x0000000573800000, 0x0000000574000000| 0%| F| |TAMS 0x0000000573800000| PB 0x0000000573800000| Untracked | 0 +| 730|0x0000000574000000, 0x0000000574000000, 0x0000000574800000| 0%| F| |TAMS 0x0000000574000000| PB 0x0000000574000000| Untracked | 0 +| 731|0x0000000574800000, 0x0000000574800000, 0x0000000575000000| 0%| F| |TAMS 0x0000000574800000| PB 0x0000000574800000| Untracked | 0 +| 732|0x0000000575000000, 0x0000000575000000, 0x0000000575800000| 0%| F| |TAMS 0x0000000575000000| PB 0x0000000575000000| Untracked | 0 +| 733|0x0000000575800000, 0x0000000575800000, 0x0000000576000000| 0%| F| |TAMS 0x0000000575800000| PB 0x0000000575800000| Untracked | 0 +| 734|0x0000000576000000, 0x0000000576000000, 0x0000000576800000| 0%| F| |TAMS 0x0000000576000000| PB 0x0000000576000000| Untracked | 0 +| 735|0x0000000576800000, 0x0000000576800000, 0x0000000577000000| 0%| F| |TAMS 0x0000000576800000| PB 0x0000000576800000| Untracked | 0 +| 736|0x0000000577000000, 0x0000000577000000, 0x0000000577800000| 0%| F| |TAMS 0x0000000577000000| PB 0x0000000577000000| Untracked | 0 +| 737|0x0000000577800000, 0x0000000577800000, 0x0000000578000000| 0%| F| |TAMS 0x0000000577800000| PB 0x0000000577800000| Untracked | 0 +| 738|0x0000000578000000, 0x0000000578000000, 0x0000000578800000| 0%| F| |TAMS 0x0000000578000000| PB 0x0000000578000000| Untracked | 0 +| 739|0x0000000578800000, 0x0000000578800000, 0x0000000579000000| 0%| F| |TAMS 0x0000000578800000| PB 0x0000000578800000| Untracked | 0 +| 740|0x0000000579000000, 0x0000000579000000, 0x0000000579800000| 0%| F| |TAMS 0x0000000579000000| PB 0x0000000579000000| Untracked | 0 +| 741|0x0000000579800000, 0x0000000579800000, 0x000000057a000000| 0%| F| |TAMS 0x0000000579800000| PB 0x0000000579800000| Untracked | 0 +| 742|0x000000057a000000, 0x000000057a000000, 0x000000057a800000| 0%| F| |TAMS 0x000000057a000000| PB 0x000000057a000000| Untracked | 0 +| 743|0x000000057a800000, 0x000000057a800000, 0x000000057b000000| 0%| F| |TAMS 0x000000057a800000| PB 0x000000057a800000| Untracked | 0 +| 744|0x000000057b000000, 0x000000057b000000, 0x000000057b800000| 0%| F| |TAMS 0x000000057b000000| PB 0x000000057b000000| Untracked | 0 +| 745|0x000000057b800000, 0x000000057b800000, 0x000000057c000000| 0%| F| |TAMS 0x000000057b800000| PB 0x000000057b800000| Untracked | 0 +| 746|0x000000057c000000, 0x000000057c000000, 0x000000057c800000| 0%| F| |TAMS 0x000000057c000000| PB 0x000000057c000000| Untracked | 0 +| 747|0x000000057c800000, 0x000000057c800000, 0x000000057d000000| 0%| F| |TAMS 0x000000057c800000| PB 0x000000057c800000| Untracked | 0 +| 748|0x000000057d000000, 0x000000057d000000, 0x000000057d800000| 0%| F| |TAMS 0x000000057d000000| PB 0x000000057d000000| Untracked | 0 +| 749|0x000000057d800000, 0x000000057d800000, 0x000000057e000000| 0%| F| |TAMS 0x000000057d800000| PB 0x000000057d800000| Untracked | 0 +| 750|0x000000057e000000, 0x000000057e000000, 0x000000057e800000| 0%| F| |TAMS 0x000000057e000000| PB 0x000000057e000000| Untracked | 0 +| 751|0x000000057e800000, 0x000000057e800000, 0x000000057f000000| 0%| F| |TAMS 0x000000057e800000| PB 0x000000057e800000| Untracked | 0 +| 752|0x000000057f000000, 0x000000057f000000, 0x000000057f800000| 0%| F| |TAMS 0x000000057f000000| PB 0x000000057f000000| Untracked | 0 +| 753|0x000000057f800000, 0x000000057f800000, 0x0000000580000000| 0%| F| |TAMS 0x000000057f800000| PB 0x000000057f800000| Untracked | 0 +| 754|0x0000000580000000, 0x0000000580000000, 0x0000000580800000| 0%| F| |TAMS 0x0000000580000000| PB 0x0000000580000000| Untracked | 0 +| 755|0x0000000580800000, 0x0000000580800000, 0x0000000581000000| 0%| F| |TAMS 0x0000000580800000| PB 0x0000000580800000| Untracked | 0 +| 756|0x0000000581000000, 0x0000000581000000, 0x0000000581800000| 0%| F| |TAMS 0x0000000581000000| PB 0x0000000581000000| Untracked | 0 +| 757|0x0000000581800000, 0x0000000581800000, 0x0000000582000000| 0%| F| |TAMS 0x0000000581800000| PB 0x0000000581800000| Untracked | 0 +| 758|0x0000000582000000, 0x0000000582000000, 0x0000000582800000| 0%| F| |TAMS 0x0000000582000000| PB 0x0000000582000000| Untracked | 0 +| 759|0x0000000582800000, 0x0000000582800000, 0x0000000583000000| 0%| F| |TAMS 0x0000000582800000| PB 0x0000000582800000| Untracked | 0 +| 760|0x0000000583000000, 0x0000000583000000, 0x0000000583800000| 0%| F| |TAMS 0x0000000583000000| PB 0x0000000583000000| Untracked | 0 +| 761|0x0000000583800000, 0x0000000583800000, 0x0000000584000000| 0%| F| |TAMS 0x0000000583800000| PB 0x0000000583800000| Untracked | 0 +| 762|0x0000000584000000, 0x0000000584000000, 0x0000000584800000| 0%| F| |TAMS 0x0000000584000000| PB 0x0000000584000000| Untracked | 0 +| 763|0x0000000584800000, 0x0000000584800000, 0x0000000585000000| 0%| F| |TAMS 0x0000000584800000| PB 0x0000000584800000| Untracked | 0 +| 764|0x0000000585000000, 0x0000000585000000, 0x0000000585800000| 0%| F| |TAMS 0x0000000585000000| PB 0x0000000585000000| Untracked | 0 +| 765|0x0000000585800000, 0x0000000585800000, 0x0000000586000000| 0%| F| |TAMS 0x0000000585800000| PB 0x0000000585800000| Untracked | 0 +| 766|0x0000000586000000, 0x0000000586000000, 0x0000000586800000| 0%| F| |TAMS 0x0000000586000000| PB 0x0000000586000000| Untracked | 0 +| 767|0x0000000586800000, 0x0000000586800000, 0x0000000587000000| 0%| F| |TAMS 0x0000000586800000| PB 0x0000000586800000| Untracked | 0 +| 768|0x0000000587000000, 0x0000000587000000, 0x0000000587800000| 0%| F| |TAMS 0x0000000587000000| PB 0x0000000587000000| Untracked | 0 +| 769|0x0000000587800000, 0x0000000587800000, 0x0000000588000000| 0%| F| |TAMS 0x0000000587800000| PB 0x0000000587800000| Untracked | 0 +| 770|0x0000000588000000, 0x0000000588000000, 0x0000000588800000| 0%| F| |TAMS 0x0000000588000000| PB 0x0000000588000000| Untracked | 0 +| 771|0x0000000588800000, 0x0000000588800000, 0x0000000589000000| 0%| F| |TAMS 0x0000000588800000| PB 0x0000000588800000| Untracked | 0 +| 772|0x0000000589000000, 0x0000000589000000, 0x0000000589800000| 0%| F| |TAMS 0x0000000589000000| PB 0x0000000589000000| Untracked | 0 +| 773|0x0000000589800000, 0x0000000589800000, 0x000000058a000000| 0%| F| |TAMS 0x0000000589800000| PB 0x0000000589800000| Untracked | 0 +| 774|0x000000058a000000, 0x000000058a000000, 0x000000058a800000| 0%| F| |TAMS 0x000000058a000000| PB 0x000000058a000000| Untracked | 0 +| 775|0x000000058a800000, 0x000000058a800000, 0x000000058b000000| 0%| F| |TAMS 0x000000058a800000| PB 0x000000058a800000| Untracked | 0 +| 776|0x000000058b000000, 0x000000058b000000, 0x000000058b800000| 0%| F| |TAMS 0x000000058b000000| PB 0x000000058b000000| Untracked | 0 +| 777|0x000000058b800000, 0x000000058b800000, 0x000000058c000000| 0%| F| |TAMS 0x000000058b800000| PB 0x000000058b800000| Untracked | 0 +| 778|0x000000058c000000, 0x000000058c000000, 0x000000058c800000| 0%| F| |TAMS 0x000000058c000000| PB 0x000000058c000000| Untracked | 0 +| 779|0x000000058c800000, 0x000000058c800000, 0x000000058d000000| 0%| F| |TAMS 0x000000058c800000| PB 0x000000058c800000| Untracked | 0 +| 780|0x000000058d000000, 0x000000058d000000, 0x000000058d800000| 0%| F| |TAMS 0x000000058d000000| PB 0x000000058d000000| Untracked | 0 +| 781|0x000000058d800000, 0x000000058d800000, 0x000000058e000000| 0%| F| |TAMS 0x000000058d800000| PB 0x000000058d800000| Untracked | 0 +| 782|0x000000058e000000, 0x000000058e000000, 0x000000058e800000| 0%| F| |TAMS 0x000000058e000000| PB 0x000000058e000000| Untracked | 0 +| 783|0x000000058e800000, 0x000000058e800000, 0x000000058f000000| 0%| F| |TAMS 0x000000058e800000| PB 0x000000058e800000| Untracked | 0 +| 784|0x000000058f000000, 0x000000058f000000, 0x000000058f800000| 0%| F| |TAMS 0x000000058f000000| PB 0x000000058f000000| Untracked | 0 +| 785|0x000000058f800000, 0x000000058f800000, 0x0000000590000000| 0%| F| |TAMS 0x000000058f800000| PB 0x000000058f800000| Untracked | 0 +| 786|0x0000000590000000, 0x0000000590000000, 0x0000000590800000| 0%| F| |TAMS 0x0000000590000000| PB 0x0000000590000000| Untracked | 0 +| 787|0x0000000590800000, 0x0000000590800000, 0x0000000591000000| 0%| F| |TAMS 0x0000000590800000| PB 0x0000000590800000| Untracked | 0 +| 788|0x0000000591000000, 0x0000000591000000, 0x0000000591800000| 0%| F| |TAMS 0x0000000591000000| PB 0x0000000591000000| Untracked | 0 +| 789|0x0000000591800000, 0x0000000591800000, 0x0000000592000000| 0%| F| |TAMS 0x0000000591800000| PB 0x0000000591800000| Untracked | 0 +| 790|0x0000000592000000, 0x0000000592000000, 0x0000000592800000| 0%| F| |TAMS 0x0000000592000000| PB 0x0000000592000000| Untracked | 0 +| 791|0x0000000592800000, 0x0000000592800000, 0x0000000593000000| 0%| F| |TAMS 0x0000000592800000| PB 0x0000000592800000| Untracked | 0 +| 792|0x0000000593000000, 0x0000000593000000, 0x0000000593800000| 0%| F| |TAMS 0x0000000593000000| PB 0x0000000593000000| Untracked | 0 +| 793|0x0000000593800000, 0x0000000593800000, 0x0000000594000000| 0%| F| |TAMS 0x0000000593800000| PB 0x0000000593800000| Untracked | 0 +| 794|0x0000000594000000, 0x0000000594000000, 0x0000000594800000| 0%| F| |TAMS 0x0000000594000000| PB 0x0000000594000000| Untracked | 0 +| 795|0x0000000594800000, 0x0000000594800000, 0x0000000595000000| 0%| F| |TAMS 0x0000000594800000| PB 0x0000000594800000| Untracked | 0 +| 796|0x0000000595000000, 0x0000000595000000, 0x0000000595800000| 0%| F| |TAMS 0x0000000595000000| PB 0x0000000595000000| Untracked | 0 +| 797|0x0000000595800000, 0x0000000595800000, 0x0000000596000000| 0%| F| |TAMS 0x0000000595800000| PB 0x0000000595800000| Untracked | 0 +| 798|0x0000000596000000, 0x0000000596000000, 0x0000000596800000| 0%| F| |TAMS 0x0000000596000000| PB 0x0000000596000000| Untracked | 0 +| 799|0x0000000596800000, 0x0000000596800000, 0x0000000597000000| 0%| F| |TAMS 0x0000000596800000| PB 0x0000000596800000| Untracked | 0 +| 800|0x0000000597000000, 0x0000000597000000, 0x0000000597800000| 0%| F| |TAMS 0x0000000597000000| PB 0x0000000597000000| Untracked | 0 +| 801|0x0000000597800000, 0x0000000597800000, 0x0000000598000000| 0%| F| |TAMS 0x0000000597800000| PB 0x0000000597800000| Untracked | 0 +| 802|0x0000000598000000, 0x0000000598000000, 0x0000000598800000| 0%| F| |TAMS 0x0000000598000000| PB 0x0000000598000000| Untracked | 0 +| 803|0x0000000598800000, 0x0000000598800000, 0x0000000599000000| 0%| F| |TAMS 0x0000000598800000| PB 0x0000000598800000| Untracked | 0 +| 804|0x0000000599000000, 0x0000000599000000, 0x0000000599800000| 0%| F| |TAMS 0x0000000599000000| PB 0x0000000599000000| Untracked | 0 +| 805|0x0000000599800000, 0x0000000599800000, 0x000000059a000000| 0%| F| |TAMS 0x0000000599800000| PB 0x0000000599800000| Untracked | 0 +| 806|0x000000059a000000, 0x000000059a000000, 0x000000059a800000| 0%| F| |TAMS 0x000000059a000000| PB 0x000000059a000000| Untracked | 0 +| 807|0x000000059a800000, 0x000000059a800000, 0x000000059b000000| 0%| F| |TAMS 0x000000059a800000| PB 0x000000059a800000| Untracked | 0 +| 808|0x000000059b000000, 0x000000059b000000, 0x000000059b800000| 0%| F| |TAMS 0x000000059b000000| PB 0x000000059b000000| Untracked | 0 +| 809|0x000000059b800000, 0x000000059b800000, 0x000000059c000000| 0%| F| |TAMS 0x000000059b800000| PB 0x000000059b800000| Untracked | 0 +| 810|0x000000059c000000, 0x000000059c000000, 0x000000059c800000| 0%| F| |TAMS 0x000000059c000000| PB 0x000000059c000000| Untracked | 0 +| 811|0x000000059c800000, 0x000000059c800000, 0x000000059d000000| 0%| F| |TAMS 0x000000059c800000| PB 0x000000059c800000| Untracked | 0 +| 812|0x000000059d000000, 0x000000059d000000, 0x000000059d800000| 0%| F| |TAMS 0x000000059d000000| PB 0x000000059d000000| Untracked | 0 +| 813|0x000000059d800000, 0x000000059d800000, 0x000000059e000000| 0%| F| |TAMS 0x000000059d800000| PB 0x000000059d800000| Untracked | 0 +| 814|0x000000059e000000, 0x000000059e000000, 0x000000059e800000| 0%| F| |TAMS 0x000000059e000000| PB 0x000000059e000000| Untracked | 0 +| 815|0x000000059e800000, 0x000000059e800000, 0x000000059f000000| 0%| F| |TAMS 0x000000059e800000| PB 0x000000059e800000| Untracked | 0 +| 816|0x000000059f000000, 0x000000059f000000, 0x000000059f800000| 0%| F| |TAMS 0x000000059f000000| PB 0x000000059f000000| Untracked | 0 +| 817|0x000000059f800000, 0x000000059f800000, 0x00000005a0000000| 0%| F| |TAMS 0x000000059f800000| PB 0x000000059f800000| Untracked | 0 +| 818|0x00000005a0000000, 0x00000005a0000000, 0x00000005a0800000| 0%| F| |TAMS 0x00000005a0000000| PB 0x00000005a0000000| Untracked | 0 +| 819|0x00000005a0800000, 0x00000005a0800000, 0x00000005a1000000| 0%| F| |TAMS 0x00000005a0800000| PB 0x00000005a0800000| Untracked | 0 +| 820|0x00000005a1000000, 0x00000005a1000000, 0x00000005a1800000| 0%| F| |TAMS 0x00000005a1000000| PB 0x00000005a1000000| Untracked | 0 +| 821|0x00000005a1800000, 0x00000005a1800000, 0x00000005a2000000| 0%| F| |TAMS 0x00000005a1800000| PB 0x00000005a1800000| Untracked | 0 +| 822|0x00000005a2000000, 0x00000005a2000000, 0x00000005a2800000| 0%| F| |TAMS 0x00000005a2000000| PB 0x00000005a2000000| Untracked | 0 +| 823|0x00000005a2800000, 0x00000005a2800000, 0x00000005a3000000| 0%| F| |TAMS 0x00000005a2800000| PB 0x00000005a2800000| Untracked | 0 +| 824|0x00000005a3000000, 0x00000005a3000000, 0x00000005a3800000| 0%| F| |TAMS 0x00000005a3000000| PB 0x00000005a3000000| Untracked | 0 +| 825|0x00000005a3800000, 0x00000005a3800000, 0x00000005a4000000| 0%| F| |TAMS 0x00000005a3800000| PB 0x00000005a3800000| Untracked | 0 +| 826|0x00000005a4000000, 0x00000005a4000000, 0x00000005a4800000| 0%| F| |TAMS 0x00000005a4000000| PB 0x00000005a4000000| Untracked | 0 +| 827|0x00000005a4800000, 0x00000005a4800000, 0x00000005a5000000| 0%| F| |TAMS 0x00000005a4800000| PB 0x00000005a4800000| Untracked | 0 +| 828|0x00000005a5000000, 0x00000005a5000000, 0x00000005a5800000| 0%| F| |TAMS 0x00000005a5000000| PB 0x00000005a5000000| Untracked | 0 +| 829|0x00000005a5800000, 0x00000005a5800000, 0x00000005a6000000| 0%| F| |TAMS 0x00000005a5800000| PB 0x00000005a5800000| Untracked | 0 +| 830|0x00000005a6000000, 0x00000005a6000000, 0x00000005a6800000| 0%| F| |TAMS 0x00000005a6000000| PB 0x00000005a6000000| Untracked | 0 +| 831|0x00000005a6800000, 0x00000005a6800000, 0x00000005a7000000| 0%| F| |TAMS 0x00000005a6800000| PB 0x00000005a6800000| Untracked | 0 +| 832|0x00000005a7000000, 0x00000005a7000000, 0x00000005a7800000| 0%| F| |TAMS 0x00000005a7000000| PB 0x00000005a7000000| Untracked | 0 +| 833|0x00000005a7800000, 0x00000005a7800000, 0x00000005a8000000| 0%| F| |TAMS 0x00000005a7800000| PB 0x00000005a7800000| Untracked | 0 +| 834|0x00000005a8000000, 0x00000005a8000000, 0x00000005a8800000| 0%| F| |TAMS 0x00000005a8000000| PB 0x00000005a8000000| Untracked | 0 +| 835|0x00000005a8800000, 0x00000005a8800000, 0x00000005a9000000| 0%| F| |TAMS 0x00000005a8800000| PB 0x00000005a8800000| Untracked | 0 +| 836|0x00000005a9000000, 0x00000005a9000000, 0x00000005a9800000| 0%| F| |TAMS 0x00000005a9000000| PB 0x00000005a9000000| Untracked | 0 +| 837|0x00000005a9800000, 0x00000005a9800000, 0x00000005aa000000| 0%| F| |TAMS 0x00000005a9800000| PB 0x00000005a9800000| Untracked | 0 +| 838|0x00000005aa000000, 0x00000005aa000000, 0x00000005aa800000| 0%| F| |TAMS 0x00000005aa000000| PB 0x00000005aa000000| Untracked | 0 +| 839|0x00000005aa800000, 0x00000005aa800000, 0x00000005ab000000| 0%| F| |TAMS 0x00000005aa800000| PB 0x00000005aa800000| Untracked | 0 +| 840|0x00000005ab000000, 0x00000005ab000000, 0x00000005ab800000| 0%| F| |TAMS 0x00000005ab000000| PB 0x00000005ab000000| Untracked | 0 +| 841|0x00000005ab800000, 0x00000005ab800000, 0x00000005ac000000| 0%| F| |TAMS 0x00000005ab800000| PB 0x00000005ab800000| Untracked | 0 +| 842|0x00000005ac000000, 0x00000005ac000000, 0x00000005ac800000| 0%| F| |TAMS 0x00000005ac000000| PB 0x00000005ac000000| Untracked | 0 +| 843|0x00000005ac800000, 0x00000005ac800000, 0x00000005ad000000| 0%| F| |TAMS 0x00000005ac800000| PB 0x00000005ac800000| Untracked | 0 +| 844|0x00000005ad000000, 0x00000005ad000000, 0x00000005ad800000| 0%| F| |TAMS 0x00000005ad000000| PB 0x00000005ad000000| Untracked | 0 +| 845|0x00000005ad800000, 0x00000005ad800000, 0x00000005ae000000| 0%| F| |TAMS 0x00000005ad800000| PB 0x00000005ad800000| Untracked | 0 +| 846|0x00000005ae000000, 0x00000005ae000000, 0x00000005ae800000| 0%| F| |TAMS 0x00000005ae000000| PB 0x00000005ae000000| Untracked | 0 +| 847|0x00000005ae800000, 0x00000005ae800000, 0x00000005af000000| 0%| F| |TAMS 0x00000005ae800000| PB 0x00000005ae800000| Untracked | 0 +| 848|0x00000005af000000, 0x00000005af000000, 0x00000005af800000| 0%| F| |TAMS 0x00000005af000000| PB 0x00000005af000000| Untracked | 0 +| 849|0x00000005af800000, 0x00000005af800000, 0x00000005b0000000| 0%| F| |TAMS 0x00000005af800000| PB 0x00000005af800000| Untracked | 0 +| 850|0x00000005b0000000, 0x00000005b0000000, 0x00000005b0800000| 0%| F| |TAMS 0x00000005b0000000| PB 0x00000005b0000000| Untracked | 0 +| 851|0x00000005b0800000, 0x00000005b0800000, 0x00000005b1000000| 0%| F| |TAMS 0x00000005b0800000| PB 0x00000005b0800000| Untracked | 0 +| 852|0x00000005b1000000, 0x00000005b1000000, 0x00000005b1800000| 0%| F| |TAMS 0x00000005b1000000| PB 0x00000005b1000000| Untracked | 0 +| 853|0x00000005b1800000, 0x00000005b1800000, 0x00000005b2000000| 0%| F| |TAMS 0x00000005b1800000| PB 0x00000005b1800000| Untracked | 0 +| 854|0x00000005b2000000, 0x00000005b2000000, 0x00000005b2800000| 0%| F| |TAMS 0x00000005b2000000| PB 0x00000005b2000000| Untracked | 0 +| 855|0x00000005b2800000, 0x00000005b2800000, 0x00000005b3000000| 0%| F| |TAMS 0x00000005b2800000| PB 0x00000005b2800000| Untracked | 0 +| 856|0x00000005b3000000, 0x00000005b3000000, 0x00000005b3800000| 0%| F| |TAMS 0x00000005b3000000| PB 0x00000005b3000000| Untracked | 0 +| 857|0x00000005b3800000, 0x00000005b3800000, 0x00000005b4000000| 0%| F| |TAMS 0x00000005b3800000| PB 0x00000005b3800000| Untracked | 0 +| 858|0x00000005b4000000, 0x00000005b4000000, 0x00000005b4800000| 0%| F| |TAMS 0x00000005b4000000| PB 0x00000005b4000000| Untracked | 0 +| 859|0x00000005b4800000, 0x00000005b4800000, 0x00000005b5000000| 0%| F| |TAMS 0x00000005b4800000| PB 0x00000005b4800000| Untracked | 0 +| 860|0x00000005b5000000, 0x00000005b5000000, 0x00000005b5800000| 0%| F| |TAMS 0x00000005b5000000| PB 0x00000005b5000000| Untracked | 0 +| 861|0x00000005b5800000, 0x00000005b5800000, 0x00000005b6000000| 0%| F| |TAMS 0x00000005b5800000| PB 0x00000005b5800000| Untracked | 0 +| 862|0x00000005b6000000, 0x00000005b6000000, 0x00000005b6800000| 0%| F| |TAMS 0x00000005b6000000| PB 0x00000005b6000000| Untracked | 0 +| 863|0x00000005b6800000, 0x00000005b6800000, 0x00000005b7000000| 0%| F| |TAMS 0x00000005b6800000| PB 0x00000005b6800000| Untracked | 0 +| 864|0x00000005b7000000, 0x00000005b7000000, 0x00000005b7800000| 0%| F| |TAMS 0x00000005b7000000| PB 0x00000005b7000000| Untracked | 0 +| 865|0x00000005b7800000, 0x00000005b7800000, 0x00000005b8000000| 0%| F| |TAMS 0x00000005b7800000| PB 0x00000005b7800000| Untracked | 0 +| 866|0x00000005b8000000, 0x00000005b8000000, 0x00000005b8800000| 0%| F| |TAMS 0x00000005b8000000| PB 0x00000005b8000000| Untracked | 0 +| 867|0x00000005b8800000, 0x00000005b8800000, 0x00000005b9000000| 0%| F| |TAMS 0x00000005b8800000| PB 0x00000005b8800000| Untracked | 0 +| 868|0x00000005b9000000, 0x00000005b9000000, 0x00000005b9800000| 0%| F| |TAMS 0x00000005b9000000| PB 0x00000005b9000000| Untracked | 0 +| 869|0x00000005b9800000, 0x00000005b9800000, 0x00000005ba000000| 0%| F| |TAMS 0x00000005b9800000| PB 0x00000005b9800000| Untracked | 0 +| 870|0x00000005ba000000, 0x00000005ba000000, 0x00000005ba800000| 0%| F| |TAMS 0x00000005ba000000| PB 0x00000005ba000000| Untracked | 0 +| 871|0x00000005ba800000, 0x00000005ba800000, 0x00000005bb000000| 0%| F| |TAMS 0x00000005ba800000| PB 0x00000005ba800000| Untracked | 0 +| 872|0x00000005bb000000, 0x00000005bb000000, 0x00000005bb800000| 0%| F| |TAMS 0x00000005bb000000| PB 0x00000005bb000000| Untracked | 0 +| 873|0x00000005bb800000, 0x00000005bb800000, 0x00000005bc000000| 0%| F| |TAMS 0x00000005bb800000| PB 0x00000005bb800000| Untracked | 0 +| 874|0x00000005bc000000, 0x00000005bc000000, 0x00000005bc800000| 0%| F| |TAMS 0x00000005bc000000| PB 0x00000005bc000000| Untracked | 0 +| 875|0x00000005bc800000, 0x00000005bc800000, 0x00000005bd000000| 0%| F| |TAMS 0x00000005bc800000| PB 0x00000005bc800000| Untracked | 0 +| 876|0x00000005bd000000, 0x00000005bd000000, 0x00000005bd800000| 0%| F| |TAMS 0x00000005bd000000| PB 0x00000005bd000000| Untracked | 0 +| 877|0x00000005bd800000, 0x00000005bd800000, 0x00000005be000000| 0%| F| |TAMS 0x00000005bd800000| PB 0x00000005bd800000| Untracked | 0 +| 878|0x00000005be000000, 0x00000005be000000, 0x00000005be800000| 0%| F| |TAMS 0x00000005be000000| PB 0x00000005be000000| Untracked | 0 +| 879|0x00000005be800000, 0x00000005be800000, 0x00000005bf000000| 0%| F| |TAMS 0x00000005be800000| PB 0x00000005be800000| Untracked | 0 +| 880|0x00000005bf000000, 0x00000005bf000000, 0x00000005bf800000| 0%| F| |TAMS 0x00000005bf000000| PB 0x00000005bf000000| Untracked | 0 +| 881|0x00000005bf800000, 0x00000005bf800000, 0x00000005c0000000| 0%| F| |TAMS 0x00000005bf800000| PB 0x00000005bf800000| Untracked | 0 +| 882|0x00000005c0000000, 0x00000005c0000000, 0x00000005c0800000| 0%| F| |TAMS 0x00000005c0000000| PB 0x00000005c0000000| Untracked | 0 +| 883|0x00000005c0800000, 0x00000005c0800000, 0x00000005c1000000| 0%| F| |TAMS 0x00000005c0800000| PB 0x00000005c0800000| Untracked | 0 +| 884|0x00000005c1000000, 0x00000005c1000000, 0x00000005c1800000| 0%| F| |TAMS 0x00000005c1000000| PB 0x00000005c1000000| Untracked | 0 +| 885|0x00000005c1800000, 0x00000005c1800000, 0x00000005c2000000| 0%| F| |TAMS 0x00000005c1800000| PB 0x00000005c1800000| Untracked | 0 +| 886|0x00000005c2000000, 0x00000005c2000000, 0x00000005c2800000| 0%| F| |TAMS 0x00000005c2000000| PB 0x00000005c2000000| Untracked | 0 +| 887|0x00000005c2800000, 0x00000005c2800000, 0x00000005c3000000| 0%| F| |TAMS 0x00000005c2800000| PB 0x00000005c2800000| Untracked | 0 +| 888|0x00000005c3000000, 0x00000005c3000000, 0x00000005c3800000| 0%| F| |TAMS 0x00000005c3000000| PB 0x00000005c3000000| Untracked | 0 +| 889|0x00000005c3800000, 0x00000005c3800000, 0x00000005c4000000| 0%| F| |TAMS 0x00000005c3800000| PB 0x00000005c3800000| Untracked | 0 +| 890|0x00000005c4000000, 0x00000005c4000000, 0x00000005c4800000| 0%| F| |TAMS 0x00000005c4000000| PB 0x00000005c4000000| Untracked | 0 +| 891|0x00000005c4800000, 0x00000005c4800000, 0x00000005c5000000| 0%| F| |TAMS 0x00000005c4800000| PB 0x00000005c4800000| Untracked | 0 +| 892|0x00000005c5000000, 0x00000005c5000000, 0x00000005c5800000| 0%| F| |TAMS 0x00000005c5000000| PB 0x00000005c5000000| Untracked | 0 +| 893|0x00000005c5800000, 0x00000005c5800000, 0x00000005c6000000| 0%| F| |TAMS 0x00000005c5800000| PB 0x00000005c5800000| Untracked | 0 +| 894|0x00000005c6000000, 0x00000005c6000000, 0x00000005c6800000| 0%| F| |TAMS 0x00000005c6000000| PB 0x00000005c6000000| Untracked | 0 +| 895|0x00000005c6800000, 0x00000005c6800000, 0x00000005c7000000| 0%| F| |TAMS 0x00000005c6800000| PB 0x00000005c6800000| Untracked | 0 +| 896|0x00000005c7000000, 0x00000005c7000000, 0x00000005c7800000| 0%| F| |TAMS 0x00000005c7000000| PB 0x00000005c7000000| Untracked | 0 +| 897|0x00000005c7800000, 0x00000005c7800000, 0x00000005c8000000| 0%| F| |TAMS 0x00000005c7800000| PB 0x00000005c7800000| Untracked | 0 +| 898|0x00000005c8000000, 0x00000005c8000000, 0x00000005c8800000| 0%| F| |TAMS 0x00000005c8000000| PB 0x00000005c8000000| Untracked | 0 +| 899|0x00000005c8800000, 0x00000005c8800000, 0x00000005c9000000| 0%| F| |TAMS 0x00000005c8800000| PB 0x00000005c8800000| Untracked | 0 +| 900|0x00000005c9000000, 0x00000005c9000000, 0x00000005c9800000| 0%| F| |TAMS 0x00000005c9000000| PB 0x00000005c9000000| Untracked | 0 +| 901|0x00000005c9800000, 0x00000005c9800000, 0x00000005ca000000| 0%| F| |TAMS 0x00000005c9800000| PB 0x00000005c9800000| Untracked | 0 +| 902|0x00000005ca000000, 0x00000005ca000000, 0x00000005ca800000| 0%| F| |TAMS 0x00000005ca000000| PB 0x00000005ca000000| Untracked | 0 +| 903|0x00000005ca800000, 0x00000005ca800000, 0x00000005cb000000| 0%| F| |TAMS 0x00000005ca800000| PB 0x00000005ca800000| Untracked | 0 +| 904|0x00000005cb000000, 0x00000005cb000000, 0x00000005cb800000| 0%| F| |TAMS 0x00000005cb000000| PB 0x00000005cb000000| Untracked | 0 +| 905|0x00000005cb800000, 0x00000005cb800000, 0x00000005cc000000| 0%| F| |TAMS 0x00000005cb800000| PB 0x00000005cb800000| Untracked | 0 +| 906|0x00000005cc000000, 0x00000005cc000000, 0x00000005cc800000| 0%| F| |TAMS 0x00000005cc000000| PB 0x00000005cc000000| Untracked | 0 +| 907|0x00000005cc800000, 0x00000005cc800000, 0x00000005cd000000| 0%| F| |TAMS 0x00000005cc800000| PB 0x00000005cc800000| Untracked | 0 +| 908|0x00000005cd000000, 0x00000005cd000000, 0x00000005cd800000| 0%| F| |TAMS 0x00000005cd000000| PB 0x00000005cd000000| Untracked | 0 +| 909|0x00000005cd800000, 0x00000005cd800000, 0x00000005ce000000| 0%| F| |TAMS 0x00000005cd800000| PB 0x00000005cd800000| Untracked | 0 +| 910|0x00000005ce000000, 0x00000005ce000000, 0x00000005ce800000| 0%| F| |TAMS 0x00000005ce000000| PB 0x00000005ce000000| Untracked | 0 +| 911|0x00000005ce800000, 0x00000005ce800000, 0x00000005cf000000| 0%| F| |TAMS 0x00000005ce800000| PB 0x00000005ce800000| Untracked | 0 +| 912|0x00000005cf000000, 0x00000005cf000000, 0x00000005cf800000| 0%| F| |TAMS 0x00000005cf000000| PB 0x00000005cf000000| Untracked | 0 +| 913|0x00000005cf800000, 0x00000005cf800000, 0x00000005d0000000| 0%| F| |TAMS 0x00000005cf800000| PB 0x00000005cf800000| Untracked | 0 +| 914|0x00000005d0000000, 0x00000005d0000000, 0x00000005d0800000| 0%| F| |TAMS 0x00000005d0000000| PB 0x00000005d0000000| Untracked | 0 +| 915|0x00000005d0800000, 0x00000005d0800000, 0x00000005d1000000| 0%| F| |TAMS 0x00000005d0800000| PB 0x00000005d0800000| Untracked | 0 +| 916|0x00000005d1000000, 0x00000005d1000000, 0x00000005d1800000| 0%| F| |TAMS 0x00000005d1000000| PB 0x00000005d1000000| Untracked | 0 +| 917|0x00000005d1800000, 0x00000005d1800000, 0x00000005d2000000| 0%| F| |TAMS 0x00000005d1800000| PB 0x00000005d1800000| Untracked | 0 +| 918|0x00000005d2000000, 0x00000005d2000000, 0x00000005d2800000| 0%| F| |TAMS 0x00000005d2000000| PB 0x00000005d2000000| Untracked | 0 +| 919|0x00000005d2800000, 0x00000005d2800000, 0x00000005d3000000| 0%| F| |TAMS 0x00000005d2800000| PB 0x00000005d2800000| Untracked | 0 +| 920|0x00000005d3000000, 0x00000005d3000000, 0x00000005d3800000| 0%| F| |TAMS 0x00000005d3000000| PB 0x00000005d3000000| Untracked | 0 +| 921|0x00000005d3800000, 0x00000005d3800000, 0x00000005d4000000| 0%| F| |TAMS 0x00000005d3800000| PB 0x00000005d3800000| Untracked | 0 +| 922|0x00000005d4000000, 0x00000005d4000000, 0x00000005d4800000| 0%| F| |TAMS 0x00000005d4000000| PB 0x00000005d4000000| Untracked | 0 +| 923|0x00000005d4800000, 0x00000005d4800000, 0x00000005d5000000| 0%| F| |TAMS 0x00000005d4800000| PB 0x00000005d4800000| Untracked | 0 +| 924|0x00000005d5000000, 0x00000005d5000000, 0x00000005d5800000| 0%| F| |TAMS 0x00000005d5000000| PB 0x00000005d5000000| Untracked | 0 +| 925|0x00000005d5800000, 0x00000005d5800000, 0x00000005d6000000| 0%| F| |TAMS 0x00000005d5800000| PB 0x00000005d5800000| Untracked | 0 +| 926|0x00000005d6000000, 0x00000005d6000000, 0x00000005d6800000| 0%| F| |TAMS 0x00000005d6000000| PB 0x00000005d6000000| Untracked | 0 +| 927|0x00000005d6800000, 0x00000005d6800000, 0x00000005d7000000| 0%| F| |TAMS 0x00000005d6800000| PB 0x00000005d6800000| Untracked | 0 +| 928|0x00000005d7000000, 0x00000005d7000000, 0x00000005d7800000| 0%| F| |TAMS 0x00000005d7000000| PB 0x00000005d7000000| Untracked | 0 +| 929|0x00000005d7800000, 0x00000005d7800000, 0x00000005d8000000| 0%| F| |TAMS 0x00000005d7800000| PB 0x00000005d7800000| Untracked | 0 +| 930|0x00000005d8000000, 0x00000005d8000000, 0x00000005d8800000| 0%| F| |TAMS 0x00000005d8000000| PB 0x00000005d8000000| Untracked | 0 +| 931|0x00000005d8800000, 0x00000005d8800000, 0x00000005d9000000| 0%| F| |TAMS 0x00000005d8800000| PB 0x00000005d8800000| Untracked | 0 +| 932|0x00000005d9000000, 0x00000005d9000000, 0x00000005d9800000| 0%| F| |TAMS 0x00000005d9000000| PB 0x00000005d9000000| Untracked | 0 +| 933|0x00000005d9800000, 0x00000005d9800000, 0x00000005da000000| 0%| F| |TAMS 0x00000005d9800000| PB 0x00000005d9800000| Untracked | 0 +| 934|0x00000005da000000, 0x00000005da000000, 0x00000005da800000| 0%| F| |TAMS 0x00000005da000000| PB 0x00000005da000000| Untracked | 0 +| 935|0x00000005da800000, 0x00000005da800000, 0x00000005db000000| 0%| F| |TAMS 0x00000005da800000| PB 0x00000005da800000| Untracked | 0 +| 936|0x00000005db000000, 0x00000005db000000, 0x00000005db800000| 0%| F| |TAMS 0x00000005db000000| PB 0x00000005db000000| Untracked | 0 +| 937|0x00000005db800000, 0x00000005db800000, 0x00000005dc000000| 0%| F| |TAMS 0x00000005db800000| PB 0x00000005db800000| Untracked | 0 +| 938|0x00000005dc000000, 0x00000005dc000000, 0x00000005dc800000| 0%| F| |TAMS 0x00000005dc000000| PB 0x00000005dc000000| Untracked | 0 +| 939|0x00000005dc800000, 0x00000005dc800000, 0x00000005dd000000| 0%| F| |TAMS 0x00000005dc800000| PB 0x00000005dc800000| Untracked | 0 +| 940|0x00000005dd000000, 0x00000005dd000000, 0x00000005dd800000| 0%| F| |TAMS 0x00000005dd000000| PB 0x00000005dd000000| Untracked | 0 +| 941|0x00000005dd800000, 0x00000005dd800000, 0x00000005de000000| 0%| F| |TAMS 0x00000005dd800000| PB 0x00000005dd800000| Untracked | 0 +| 942|0x00000005de000000, 0x00000005de000000, 0x00000005de800000| 0%| F| |TAMS 0x00000005de000000| PB 0x00000005de000000| Untracked | 0 +| 943|0x00000005de800000, 0x00000005de800000, 0x00000005df000000| 0%| F| |TAMS 0x00000005de800000| PB 0x00000005de800000| Untracked | 0 +| 944|0x00000005df000000, 0x00000005df000000, 0x00000005df800000| 0%| F| |TAMS 0x00000005df000000| PB 0x00000005df000000| Untracked | 0 +| 945|0x00000005df800000, 0x00000005df800000, 0x00000005e0000000| 0%| F| |TAMS 0x00000005df800000| PB 0x00000005df800000| Untracked | 0 +| 946|0x00000005e0000000, 0x00000005e0000000, 0x00000005e0800000| 0%| F| |TAMS 0x00000005e0000000| PB 0x00000005e0000000| Untracked | 0 +| 947|0x00000005e0800000, 0x00000005e0800000, 0x00000005e1000000| 0%| F| |TAMS 0x00000005e0800000| PB 0x00000005e0800000| Untracked | 0 +| 948|0x00000005e1000000, 0x00000005e1000000, 0x00000005e1800000| 0%| F| |TAMS 0x00000005e1000000| PB 0x00000005e1000000| Untracked | 0 +| 949|0x00000005e1800000, 0x00000005e1800000, 0x00000005e2000000| 0%| F| |TAMS 0x00000005e1800000| PB 0x00000005e1800000| Untracked | 0 +| 950|0x00000005e2000000, 0x00000005e2000000, 0x00000005e2800000| 0%| F| |TAMS 0x00000005e2000000| PB 0x00000005e2000000| Untracked | 0 +| 951|0x00000005e2800000, 0x00000005e2800000, 0x00000005e3000000| 0%| F| |TAMS 0x00000005e2800000| PB 0x00000005e2800000| Untracked | 0 +| 952|0x00000005e3000000, 0x00000005e3000000, 0x00000005e3800000| 0%| F| |TAMS 0x00000005e3000000| PB 0x00000005e3000000| Untracked | 0 +| 953|0x00000005e3800000, 0x00000005e3800000, 0x00000005e4000000| 0%| F| |TAMS 0x00000005e3800000| PB 0x00000005e3800000| Untracked | 0 +| 954|0x00000005e4000000, 0x00000005e4000000, 0x00000005e4800000| 0%| F| |TAMS 0x00000005e4000000| PB 0x00000005e4000000| Untracked | 0 +| 955|0x00000005e4800000, 0x00000005e4800000, 0x00000005e5000000| 0%| F| |TAMS 0x00000005e4800000| PB 0x00000005e4800000| Untracked | 0 +| 956|0x00000005e5000000, 0x00000005e5000000, 0x00000005e5800000| 0%| F| |TAMS 0x00000005e5000000| PB 0x00000005e5000000| Untracked | 0 +| 957|0x00000005e5800000, 0x00000005e5800000, 0x00000005e6000000| 0%| F| |TAMS 0x00000005e5800000| PB 0x00000005e5800000| Untracked | 0 +| 958|0x00000005e6000000, 0x00000005e6000000, 0x00000005e6800000| 0%| F| |TAMS 0x00000005e6000000| PB 0x00000005e6000000| Untracked | 0 +| 959|0x00000005e6800000, 0x00000005e6800000, 0x00000005e7000000| 0%| F| |TAMS 0x00000005e6800000| PB 0x00000005e6800000| Untracked | 0 +| 960|0x00000005e7000000, 0x00000005e7000000, 0x00000005e7800000| 0%| F| |TAMS 0x00000005e7000000| PB 0x00000005e7000000| Untracked | 0 +| 961|0x00000005e7800000, 0x00000005e7800000, 0x00000005e8000000| 0%| F| |TAMS 0x00000005e7800000| PB 0x00000005e7800000| Untracked | 0 +| 962|0x00000005e8000000, 0x00000005e8000000, 0x00000005e8800000| 0%| F| |TAMS 0x00000005e8000000| PB 0x00000005e8000000| Untracked | 0 +| 963|0x00000005e8800000, 0x00000005e8800000, 0x00000005e9000000| 0%| F| |TAMS 0x00000005e8800000| PB 0x00000005e8800000| Untracked | 0 +| 964|0x00000005e9000000, 0x00000005e9000000, 0x00000005e9800000| 0%| F| |TAMS 0x00000005e9000000| PB 0x00000005e9000000| Untracked | 0 +| 965|0x00000005e9800000, 0x00000005e9800000, 0x00000005ea000000| 0%| F| |TAMS 0x00000005e9800000| PB 0x00000005e9800000| Untracked | 0 +| 966|0x00000005ea000000, 0x00000005ea000000, 0x00000005ea800000| 0%| F| |TAMS 0x00000005ea000000| PB 0x00000005ea000000| Untracked | 0 +| 967|0x00000005ea800000, 0x00000005ea800000, 0x00000005eb000000| 0%| F| |TAMS 0x00000005ea800000| PB 0x00000005ea800000| Untracked | 0 +| 968|0x00000005eb000000, 0x00000005eb000000, 0x00000005eb800000| 0%| F| |TAMS 0x00000005eb000000| PB 0x00000005eb000000| Untracked | 0 +| 969|0x00000005eb800000, 0x00000005eb800000, 0x00000005ec000000| 0%| F| |TAMS 0x00000005eb800000| PB 0x00000005eb800000| Untracked | 0 +| 970|0x00000005ec000000, 0x00000005ec000000, 0x00000005ec800000| 0%| F| |TAMS 0x00000005ec000000| PB 0x00000005ec000000| Untracked | 0 +| 971|0x00000005ec800000, 0x00000005ec800000, 0x00000005ed000000| 0%| F| |TAMS 0x00000005ec800000| PB 0x00000005ec800000| Untracked | 0 +| 972|0x00000005ed000000, 0x00000005ed000000, 0x00000005ed800000| 0%| F| |TAMS 0x00000005ed000000| PB 0x00000005ed000000| Untracked | 0 +| 973|0x00000005ed800000, 0x00000005ed800000, 0x00000005ee000000| 0%| F| |TAMS 0x00000005ed800000| PB 0x00000005ed800000| Untracked | 0 +| 974|0x00000005ee000000, 0x00000005ee000000, 0x00000005ee800000| 0%| F| |TAMS 0x00000005ee000000| PB 0x00000005ee000000| Untracked | 0 +| 975|0x00000005ee800000, 0x00000005ee800000, 0x00000005ef000000| 0%| F| |TAMS 0x00000005ee800000| PB 0x00000005ee800000| Untracked | 0 +| 976|0x00000005ef000000, 0x00000005ef000000, 0x00000005ef800000| 0%| F| |TAMS 0x00000005ef000000| PB 0x00000005ef000000| Untracked | 0 +| 977|0x00000005ef800000, 0x00000005ef800000, 0x00000005f0000000| 0%| F| |TAMS 0x00000005ef800000| PB 0x00000005ef800000| Untracked | 0 +| 978|0x00000005f0000000, 0x00000005f0000000, 0x00000005f0800000| 0%| F| |TAMS 0x00000005f0000000| PB 0x00000005f0000000| Untracked | 0 +| 979|0x00000005f0800000, 0x00000005f0800000, 0x00000005f1000000| 0%| F| |TAMS 0x00000005f0800000| PB 0x00000005f0800000| Untracked | 0 +| 980|0x00000005f1000000, 0x00000005f1000000, 0x00000005f1800000| 0%| F| |TAMS 0x00000005f1000000| PB 0x00000005f1000000| Untracked | 0 +| 981|0x00000005f1800000, 0x00000005f1800000, 0x00000005f2000000| 0%| F| |TAMS 0x00000005f1800000| PB 0x00000005f1800000| Untracked | 0 +| 982|0x00000005f2000000, 0x00000005f2000000, 0x00000005f2800000| 0%| F| |TAMS 0x00000005f2000000| PB 0x00000005f2000000| Untracked | 0 +| 983|0x00000005f2800000, 0x00000005f2800000, 0x00000005f3000000| 0%| F| |TAMS 0x00000005f2800000| PB 0x00000005f2800000| Untracked | 0 +| 984|0x00000005f3000000, 0x00000005f3000000, 0x00000005f3800000| 0%| F| |TAMS 0x00000005f3000000| PB 0x00000005f3000000| Untracked | 0 +| 985|0x00000005f3800000, 0x00000005f3800000, 0x00000005f4000000| 0%| F| |TAMS 0x00000005f3800000| PB 0x00000005f3800000| Untracked | 0 +| 986|0x00000005f4000000, 0x00000005f4000000, 0x00000005f4800000| 0%| F| |TAMS 0x00000005f4000000| PB 0x00000005f4000000| Untracked | 0 +| 987|0x00000005f4800000, 0x00000005f4800000, 0x00000005f5000000| 0%| F| |TAMS 0x00000005f4800000| PB 0x00000005f4800000| Untracked | 0 +| 988|0x00000005f5000000, 0x00000005f5000000, 0x00000005f5800000| 0%| F| |TAMS 0x00000005f5000000| PB 0x00000005f5000000| Untracked | 0 +| 989|0x00000005f5800000, 0x00000005f5800000, 0x00000005f6000000| 0%| F| |TAMS 0x00000005f5800000| PB 0x00000005f5800000| Untracked | 0 +| 990|0x00000005f6000000, 0x00000005f6000000, 0x00000005f6800000| 0%| F| |TAMS 0x00000005f6000000| PB 0x00000005f6000000| Untracked | 0 +| 991|0x00000005f6800000, 0x00000005f6800000, 0x00000005f7000000| 0%| F| |TAMS 0x00000005f6800000| PB 0x00000005f6800000| Untracked | 0 +| 992|0x00000005f7000000, 0x00000005f7000000, 0x00000005f7800000| 0%| F| |TAMS 0x00000005f7000000| PB 0x00000005f7000000| Untracked | 0 +| 993|0x00000005f7800000, 0x00000005f7800000, 0x00000005f8000000| 0%| F| |TAMS 0x00000005f7800000| PB 0x00000005f7800000| Untracked | 0 +| 994|0x00000005f8000000, 0x00000005f8000000, 0x00000005f8800000| 0%| F| |TAMS 0x00000005f8000000| PB 0x00000005f8000000| Untracked | 0 +| 995|0x00000005f8800000, 0x00000005f8800000, 0x00000005f9000000| 0%| F| |TAMS 0x00000005f8800000| PB 0x00000005f8800000| Untracked | 0 +| 996|0x00000005f9000000, 0x00000005f9000000, 0x00000005f9800000| 0%| F| |TAMS 0x00000005f9000000| PB 0x00000005f9000000| Untracked | 0 +| 997|0x00000005f9800000, 0x00000005f9800000, 0x00000005fa000000| 0%| F| |TAMS 0x00000005f9800000| PB 0x00000005f9800000| Untracked | 0 +| 998|0x00000005fa000000, 0x00000005fa000000, 0x00000005fa800000| 0%| F| |TAMS 0x00000005fa000000| PB 0x00000005fa000000| Untracked | 0 +| 999|0x00000005fa800000, 0x00000005fa800000, 0x00000005fb000000| 0%| F| |TAMS 0x00000005fa800000| PB 0x00000005fa800000| Untracked | 0 +|1000|0x00000005fb000000, 0x00000005fb000000, 0x00000005fb800000| 0%| F| |TAMS 0x00000005fb000000| PB 0x00000005fb000000| Untracked | 0 +|1001|0x00000005fb800000, 0x00000005fb800000, 0x00000005fc000000| 0%| F| |TAMS 0x00000005fb800000| PB 0x00000005fb800000| Untracked | 0 +|1002|0x00000005fc000000, 0x00000005fc000000, 0x00000005fc800000| 0%| F| |TAMS 0x00000005fc000000| PB 0x00000005fc000000| Untracked | 0 +|1003|0x00000005fc800000, 0x00000005fc800000, 0x00000005fd000000| 0%| F| |TAMS 0x00000005fc800000| PB 0x00000005fc800000| Untracked | 0 +|1004|0x00000005fd000000, 0x00000005fd000000, 0x00000005fd800000| 0%| F| |TAMS 0x00000005fd000000| PB 0x00000005fd000000| Untracked | 0 +|1005|0x00000005fd800000, 0x00000005fd800000, 0x00000005fe000000| 0%| F| |TAMS 0x00000005fd800000| PB 0x00000005fd800000| Untracked | 0 +|1006|0x00000005fe000000, 0x00000005fe000000, 0x00000005fe800000| 0%| F| |TAMS 0x00000005fe000000| PB 0x00000005fe000000| Untracked | 0 +|1007|0x00000005fe800000, 0x00000005fe800000, 0x00000005ff000000| 0%| F| |TAMS 0x00000005fe800000| PB 0x00000005fe800000| Untracked | 0 +|1008|0x00000005ff000000, 0x00000005ff000000, 0x00000005ff800000| 0%| F| |TAMS 0x00000005ff000000| PB 0x00000005ff000000| Untracked | 0 +|1009|0x00000005ff800000, 0x00000005ff800000, 0x0000000600000000| 0%| F| |TAMS 0x00000005ff800000| PB 0x00000005ff800000| Untracked | 0 +|1010|0x0000000600000000, 0x0000000600000000, 0x0000000600800000| 0%| F| |TAMS 0x0000000600000000| PB 0x0000000600000000| Untracked | 0 +|1011|0x0000000600800000, 0x0000000600800000, 0x0000000601000000| 0%| F| |TAMS 0x0000000600800000| PB 0x0000000600800000| Untracked | 0 +|1012|0x0000000601000000, 0x0000000601000000, 0x0000000601800000| 0%| F| |TAMS 0x0000000601000000| PB 0x0000000601000000| Untracked | 0 +|1013|0x0000000601800000, 0x0000000601800000, 0x0000000602000000| 0%| F| |TAMS 0x0000000601800000| PB 0x0000000601800000| Untracked | 0 +|1014|0x0000000602000000, 0x0000000602000000, 0x0000000602800000| 0%| F| |TAMS 0x0000000602000000| PB 0x0000000602000000| Untracked | 0 +|1015|0x0000000602800000, 0x0000000602800000, 0x0000000603000000| 0%| F| |TAMS 0x0000000602800000| PB 0x0000000602800000| Untracked | 0 +|1016|0x0000000603000000, 0x0000000603000000, 0x0000000603800000| 0%| F| |TAMS 0x0000000603000000| PB 0x0000000603000000| Untracked | 0 +|1017|0x0000000603800000, 0x0000000603800000, 0x0000000604000000| 0%| F| |TAMS 0x0000000603800000| PB 0x0000000603800000| Untracked | 0 +|1018|0x0000000604000000, 0x0000000604000000, 0x0000000604800000| 0%| F| |TAMS 0x0000000604000000| PB 0x0000000604000000| Untracked | 0 +|1019|0x0000000604800000, 0x0000000604800000, 0x0000000605000000| 0%| F| |TAMS 0x0000000604800000| PB 0x0000000604800000| Untracked | 0 +|1020|0x0000000605000000, 0x0000000605000000, 0x0000000605800000| 0%| F| |TAMS 0x0000000605000000| PB 0x0000000605000000| Untracked | 0 +|1021|0x0000000605800000, 0x0000000605800000, 0x0000000606000000| 0%| F| |TAMS 0x0000000605800000| PB 0x0000000605800000| Untracked | 0 +|1022|0x0000000606000000, 0x0000000606000000, 0x0000000606800000| 0%| F| |TAMS 0x0000000606000000| PB 0x0000000606000000| Untracked | 0 +|1023|0x0000000606800000, 0x0000000606800000, 0x0000000607000000| 0%| F| |TAMS 0x0000000606800000| PB 0x0000000606800000| Untracked | 0 +|1024|0x0000000607000000, 0x0000000607000000, 0x0000000607800000| 0%| F| |TAMS 0x0000000607000000| PB 0x0000000607000000| Untracked | 0 +|1025|0x0000000607800000, 0x0000000607800000, 0x0000000608000000| 0%| F| |TAMS 0x0000000607800000| PB 0x0000000607800000| Untracked | 0 +|1026|0x0000000608000000, 0x0000000608000000, 0x0000000608800000| 0%| F| |TAMS 0x0000000608000000| PB 0x0000000608000000| Untracked | 0 +|1027|0x0000000608800000, 0x0000000608800000, 0x0000000609000000| 0%| F| |TAMS 0x0000000608800000| PB 0x0000000608800000| Untracked | 0 +|1028|0x0000000609000000, 0x0000000609000000, 0x0000000609800000| 0%| F| |TAMS 0x0000000609000000| PB 0x0000000609000000| Untracked | 0 +|1029|0x0000000609800000, 0x0000000609800000, 0x000000060a000000| 0%| F| |TAMS 0x0000000609800000| PB 0x0000000609800000| Untracked | 0 +|1030|0x000000060a000000, 0x000000060a000000, 0x000000060a800000| 0%| F| |TAMS 0x000000060a000000| PB 0x000000060a000000| Untracked | 0 +|1031|0x000000060a800000, 0x000000060a800000, 0x000000060b000000| 0%| F| |TAMS 0x000000060a800000| PB 0x000000060a800000| Untracked | 0 +|1032|0x000000060b000000, 0x000000060b000000, 0x000000060b800000| 0%| F| |TAMS 0x000000060b000000| PB 0x000000060b000000| Untracked | 0 +|1033|0x000000060b800000, 0x000000060b800000, 0x000000060c000000| 0%| F| |TAMS 0x000000060b800000| PB 0x000000060b800000| Untracked | 0 +|1034|0x000000060c000000, 0x000000060c000000, 0x000000060c800000| 0%| F| |TAMS 0x000000060c000000| PB 0x000000060c000000| Untracked | 0 +|1035|0x000000060c800000, 0x000000060c800000, 0x000000060d000000| 0%| F| |TAMS 0x000000060c800000| PB 0x000000060c800000| Untracked | 0 +|1036|0x000000060d000000, 0x000000060d000000, 0x000000060d800000| 0%| F| |TAMS 0x000000060d000000| PB 0x000000060d000000| Untracked | 0 +|1037|0x000000060d800000, 0x000000060d800000, 0x000000060e000000| 0%| F| |TAMS 0x000000060d800000| PB 0x000000060d800000| Untracked | 0 +|1038|0x000000060e000000, 0x000000060e000000, 0x000000060e800000| 0%| F| |TAMS 0x000000060e000000| PB 0x000000060e000000| Untracked | 0 +|1039|0x000000060e800000, 0x000000060e800000, 0x000000060f000000| 0%| F| |TAMS 0x000000060e800000| PB 0x000000060e800000| Untracked | 0 +|1040|0x000000060f000000, 0x000000060f000000, 0x000000060f800000| 0%| F| |TAMS 0x000000060f000000| PB 0x000000060f000000| Untracked | 0 +|1041|0x000000060f800000, 0x000000060f800000, 0x0000000610000000| 0%| F| |TAMS 0x000000060f800000| PB 0x000000060f800000| Untracked | 0 +|1042|0x0000000610000000, 0x0000000610000000, 0x0000000610800000| 0%| F| |TAMS 0x0000000610000000| PB 0x0000000610000000| Untracked | 0 +|1043|0x0000000610800000, 0x0000000610800000, 0x0000000611000000| 0%| F| |TAMS 0x0000000610800000| PB 0x0000000610800000| Untracked | 0 +|1044|0x0000000611000000, 0x0000000611000000, 0x0000000611800000| 0%| F| |TAMS 0x0000000611000000| PB 0x0000000611000000| Untracked | 0 +|1045|0x0000000611800000, 0x0000000611800000, 0x0000000612000000| 0%| F| |TAMS 0x0000000611800000| PB 0x0000000611800000| Untracked | 0 +|1046|0x0000000612000000, 0x0000000612000000, 0x0000000612800000| 0%| F| |TAMS 0x0000000612000000| PB 0x0000000612000000| Untracked | 0 +|1047|0x0000000612800000, 0x0000000612800000, 0x0000000613000000| 0%| F| |TAMS 0x0000000612800000| PB 0x0000000612800000| Untracked | 0 +|1048|0x0000000613000000, 0x0000000613000000, 0x0000000613800000| 0%| F| |TAMS 0x0000000613000000| PB 0x0000000613000000| Untracked | 0 +|1049|0x0000000613800000, 0x0000000613800000, 0x0000000614000000| 0%| F| |TAMS 0x0000000613800000| PB 0x0000000613800000| Untracked | 0 +|1050|0x0000000614000000, 0x0000000614000000, 0x0000000614800000| 0%| F| |TAMS 0x0000000614000000| PB 0x0000000614000000| Untracked | 0 +|1051|0x0000000614800000, 0x0000000614800000, 0x0000000615000000| 0%| F| |TAMS 0x0000000614800000| PB 0x0000000614800000| Untracked | 0 +|1052|0x0000000615000000, 0x0000000615000000, 0x0000000615800000| 0%| F| |TAMS 0x0000000615000000| PB 0x0000000615000000| Untracked | 0 +|1053|0x0000000615800000, 0x0000000615800000, 0x0000000616000000| 0%| F| |TAMS 0x0000000615800000| PB 0x0000000615800000| Untracked | 0 +|1054|0x0000000616000000, 0x0000000616000000, 0x0000000616800000| 0%| F| |TAMS 0x0000000616000000| PB 0x0000000616000000| Untracked | 0 +|1055|0x0000000616800000, 0x0000000616800000, 0x0000000617000000| 0%| F| |TAMS 0x0000000616800000| PB 0x0000000616800000| Untracked | 0 +|1056|0x0000000617000000, 0x0000000617000000, 0x0000000617800000| 0%| F| |TAMS 0x0000000617000000| PB 0x0000000617000000| Untracked | 0 +|1057|0x0000000617800000, 0x0000000617800000, 0x0000000618000000| 0%| F| |TAMS 0x0000000617800000| PB 0x0000000617800000| Untracked | 0 +|1058|0x0000000618000000, 0x0000000618000000, 0x0000000618800000| 0%| F| |TAMS 0x0000000618000000| PB 0x0000000618000000| Untracked | 0 +|1059|0x0000000618800000, 0x0000000618800000, 0x0000000619000000| 0%| F| |TAMS 0x0000000618800000| PB 0x0000000618800000| Untracked | 0 +|1060|0x0000000619000000, 0x0000000619000000, 0x0000000619800000| 0%| F| |TAMS 0x0000000619000000| PB 0x0000000619000000| Untracked | 0 +|1061|0x0000000619800000, 0x0000000619800000, 0x000000061a000000| 0%| F| |TAMS 0x0000000619800000| PB 0x0000000619800000| Untracked | 0 +|1062|0x000000061a000000, 0x000000061a000000, 0x000000061a800000| 0%| F| |TAMS 0x000000061a000000| PB 0x000000061a000000| Untracked | 0 +|1063|0x000000061a800000, 0x000000061a800000, 0x000000061b000000| 0%| F| |TAMS 0x000000061a800000| PB 0x000000061a800000| Untracked | 0 +|1064|0x000000061b000000, 0x000000061b000000, 0x000000061b800000| 0%| F| |TAMS 0x000000061b000000| PB 0x000000061b000000| Untracked | 0 +|1065|0x000000061b800000, 0x000000061b800000, 0x000000061c000000| 0%| F| |TAMS 0x000000061b800000| PB 0x000000061b800000| Untracked | 0 +|1066|0x000000061c000000, 0x000000061c000000, 0x000000061c800000| 0%| F| |TAMS 0x000000061c000000| PB 0x000000061c000000| Untracked | 0 +|1067|0x000000061c800000, 0x000000061c800000, 0x000000061d000000| 0%| F| |TAMS 0x000000061c800000| PB 0x000000061c800000| Untracked | 0 +|1068|0x000000061d000000, 0x000000061d000000, 0x000000061d800000| 0%| F| |TAMS 0x000000061d000000| PB 0x000000061d000000| Untracked | 0 +|1069|0x000000061d800000, 0x000000061d800000, 0x000000061e000000| 0%| F| |TAMS 0x000000061d800000| PB 0x000000061d800000| Untracked | 0 +|1070|0x000000061e000000, 0x000000061e000000, 0x000000061e800000| 0%| F| |TAMS 0x000000061e000000| PB 0x000000061e000000| Untracked | 0 +|1071|0x000000061e800000, 0x000000061e800000, 0x000000061f000000| 0%| F| |TAMS 0x000000061e800000| PB 0x000000061e800000| Untracked | 0 +|1072|0x000000061f000000, 0x000000061f000000, 0x000000061f800000| 0%| F| |TAMS 0x000000061f000000| PB 0x000000061f000000| Untracked | 0 +|1073|0x000000061f800000, 0x000000061f800000, 0x0000000620000000| 0%| F| |TAMS 0x000000061f800000| PB 0x000000061f800000| Untracked | 0 +|1074|0x0000000620000000, 0x0000000620000000, 0x0000000620800000| 0%| F| |TAMS 0x0000000620000000| PB 0x0000000620000000| Untracked | 0 +|1075|0x0000000620800000, 0x0000000620800000, 0x0000000621000000| 0%| F| |TAMS 0x0000000620800000| PB 0x0000000620800000| Untracked | 0 +|1076|0x0000000621000000, 0x0000000621000000, 0x0000000621800000| 0%| F| |TAMS 0x0000000621000000| PB 0x0000000621000000| Untracked | 0 +|1077|0x0000000621800000, 0x0000000621800000, 0x0000000622000000| 0%| F| |TAMS 0x0000000621800000| PB 0x0000000621800000| Untracked | 0 +|1078|0x0000000622000000, 0x0000000622000000, 0x0000000622800000| 0%| F| |TAMS 0x0000000622000000| PB 0x0000000622000000| Untracked | 0 +|1079|0x0000000622800000, 0x0000000622800000, 0x0000000623000000| 0%| F| |TAMS 0x0000000622800000| PB 0x0000000622800000| Untracked | 0 +|1080|0x0000000623000000, 0x0000000623000000, 0x0000000623800000| 0%| F| |TAMS 0x0000000623000000| PB 0x0000000623000000| Untracked | 0 +|1081|0x0000000623800000, 0x0000000623800000, 0x0000000624000000| 0%| F| |TAMS 0x0000000623800000| PB 0x0000000623800000| Untracked | 0 +|1082|0x0000000624000000, 0x0000000624000000, 0x0000000624800000| 0%| F| |TAMS 0x0000000624000000| PB 0x0000000624000000| Untracked | 0 +|1083|0x0000000624800000, 0x0000000624800000, 0x0000000625000000| 0%| F| |TAMS 0x0000000624800000| PB 0x0000000624800000| Untracked | 0 +|1084|0x0000000625000000, 0x0000000625000000, 0x0000000625800000| 0%| F| |TAMS 0x0000000625000000| PB 0x0000000625000000| Untracked | 0 +|1085|0x0000000625800000, 0x0000000625800000, 0x0000000626000000| 0%| F| |TAMS 0x0000000625800000| PB 0x0000000625800000| Untracked | 0 +|1086|0x0000000626000000, 0x0000000626000000, 0x0000000626800000| 0%| F| |TAMS 0x0000000626000000| PB 0x0000000626000000| Untracked | 0 +|1087|0x0000000626800000, 0x0000000626800000, 0x0000000627000000| 0%| F| |TAMS 0x0000000626800000| PB 0x0000000626800000| Untracked | 0 +|1088|0x0000000627000000, 0x0000000627000000, 0x0000000627800000| 0%| F| |TAMS 0x0000000627000000| PB 0x0000000627000000| Untracked | 0 +|1089|0x0000000627800000, 0x0000000627800000, 0x0000000628000000| 0%| F| |TAMS 0x0000000627800000| PB 0x0000000627800000| Untracked | 0 +|1090|0x0000000628000000, 0x0000000628000000, 0x0000000628800000| 0%| F| |TAMS 0x0000000628000000| PB 0x0000000628000000| Untracked | 0 +|1091|0x0000000628800000, 0x0000000628800000, 0x0000000629000000| 0%| F| |TAMS 0x0000000628800000| PB 0x0000000628800000| Untracked | 0 +|1092|0x0000000629000000, 0x0000000629000000, 0x0000000629800000| 0%| F| |TAMS 0x0000000629000000| PB 0x0000000629000000| Untracked | 0 +|1093|0x0000000629800000, 0x0000000629800000, 0x000000062a000000| 0%| F| |TAMS 0x0000000629800000| PB 0x0000000629800000| Untracked | 0 +|1094|0x000000062a000000, 0x000000062a000000, 0x000000062a800000| 0%| F| |TAMS 0x000000062a000000| PB 0x000000062a000000| Untracked | 0 +|1095|0x000000062a800000, 0x000000062a800000, 0x000000062b000000| 0%| F| |TAMS 0x000000062a800000| PB 0x000000062a800000| Untracked | 0 +|1096|0x000000062b000000, 0x000000062b000000, 0x000000062b800000| 0%| F| |TAMS 0x000000062b000000| PB 0x000000062b000000| Untracked | 0 +|1097|0x000000062b800000, 0x000000062b800000, 0x000000062c000000| 0%| F| |TAMS 0x000000062b800000| PB 0x000000062b800000| Untracked | 0 +|1098|0x000000062c000000, 0x000000062c000000, 0x000000062c800000| 0%| F| |TAMS 0x000000062c000000| PB 0x000000062c000000| Untracked | 0 +|1099|0x000000062c800000, 0x000000062c800000, 0x000000062d000000| 0%| F| |TAMS 0x000000062c800000| PB 0x000000062c800000| Untracked | 0 +|1100|0x000000062d000000, 0x000000062d000000, 0x000000062d800000| 0%| F| |TAMS 0x000000062d000000| PB 0x000000062d000000| Untracked | 0 +|1101|0x000000062d800000, 0x000000062d800000, 0x000000062e000000| 0%| F| |TAMS 0x000000062d800000| PB 0x000000062d800000| Untracked | 0 +|1102|0x000000062e000000, 0x000000062e000000, 0x000000062e800000| 0%| F| |TAMS 0x000000062e000000| PB 0x000000062e000000| Untracked | 0 +|1103|0x000000062e800000, 0x000000062e800000, 0x000000062f000000| 0%| F| |TAMS 0x000000062e800000| PB 0x000000062e800000| Untracked | 0 +|1104|0x000000062f000000, 0x000000062f000000, 0x000000062f800000| 0%| F| |TAMS 0x000000062f000000| PB 0x000000062f000000| Untracked | 0 +|1105|0x000000062f800000, 0x000000062f800000, 0x0000000630000000| 0%| F| |TAMS 0x000000062f800000| PB 0x000000062f800000| Untracked | 0 +|1106|0x0000000630000000, 0x0000000630000000, 0x0000000630800000| 0%| F| |TAMS 0x0000000630000000| PB 0x0000000630000000| Untracked | 0 +|1107|0x0000000630800000, 0x0000000630800000, 0x0000000631000000| 0%| F| |TAMS 0x0000000630800000| PB 0x0000000630800000| Untracked | 0 +|1108|0x0000000631000000, 0x0000000631000000, 0x0000000631800000| 0%| F| |TAMS 0x0000000631000000| PB 0x0000000631000000| Untracked | 0 +|1109|0x0000000631800000, 0x0000000631800000, 0x0000000632000000| 0%| F| |TAMS 0x0000000631800000| PB 0x0000000631800000| Untracked | 0 +|1110|0x0000000632000000, 0x0000000632000000, 0x0000000632800000| 0%| F| |TAMS 0x0000000632000000| PB 0x0000000632000000| Untracked | 0 +|1111|0x0000000632800000, 0x0000000632800000, 0x0000000633000000| 0%| F| |TAMS 0x0000000632800000| PB 0x0000000632800000| Untracked | 0 +|1112|0x0000000633000000, 0x0000000633000000, 0x0000000633800000| 0%| F| |TAMS 0x0000000633000000| PB 0x0000000633000000| Untracked | 0 +|1113|0x0000000633800000, 0x0000000633800000, 0x0000000634000000| 0%| F| |TAMS 0x0000000633800000| PB 0x0000000633800000| Untracked | 0 +|1114|0x0000000634000000, 0x0000000634000000, 0x0000000634800000| 0%| F| |TAMS 0x0000000634000000| PB 0x0000000634000000| Untracked | 0 +|1115|0x0000000634800000, 0x0000000634800000, 0x0000000635000000| 0%| F| |TAMS 0x0000000634800000| PB 0x0000000634800000| Untracked | 0 +|1116|0x0000000635000000, 0x0000000635000000, 0x0000000635800000| 0%| F| |TAMS 0x0000000635000000| PB 0x0000000635000000| Untracked | 0 +|1117|0x0000000635800000, 0x0000000635800000, 0x0000000636000000| 0%| F| |TAMS 0x0000000635800000| PB 0x0000000635800000| Untracked | 0 +|1118|0x0000000636000000, 0x0000000636000000, 0x0000000636800000| 0%| F| |TAMS 0x0000000636000000| PB 0x0000000636000000| Untracked | 0 +|1119|0x0000000636800000, 0x0000000636800000, 0x0000000637000000| 0%| F| |TAMS 0x0000000636800000| PB 0x0000000636800000| Untracked | 0 +|1120|0x0000000637000000, 0x0000000637000000, 0x0000000637800000| 0%| F| |TAMS 0x0000000637000000| PB 0x0000000637000000| Untracked | 0 +|1121|0x0000000637800000, 0x0000000637800000, 0x0000000638000000| 0%| F| |TAMS 0x0000000637800000| PB 0x0000000637800000| Untracked | 0 +|1122|0x0000000638000000, 0x0000000638000000, 0x0000000638800000| 0%| F| |TAMS 0x0000000638000000| PB 0x0000000638000000| Untracked | 0 +|1123|0x0000000638800000, 0x0000000638800000, 0x0000000639000000| 0%| F| |TAMS 0x0000000638800000| PB 0x0000000638800000| Untracked | 0 +|1124|0x0000000639000000, 0x0000000639000000, 0x0000000639800000| 0%| F| |TAMS 0x0000000639000000| PB 0x0000000639000000| Untracked | 0 +|1125|0x0000000639800000, 0x0000000639800000, 0x000000063a000000| 0%| F| |TAMS 0x0000000639800000| PB 0x0000000639800000| Untracked | 0 +|1126|0x000000063a000000, 0x000000063a000000, 0x000000063a800000| 0%| F| |TAMS 0x000000063a000000| PB 0x000000063a000000| Untracked | 0 +|1127|0x000000063a800000, 0x000000063a800000, 0x000000063b000000| 0%| F| |TAMS 0x000000063a800000| PB 0x000000063a800000| Untracked | 0 +|1128|0x000000063b000000, 0x000000063b000000, 0x000000063b800000| 0%| F| |TAMS 0x000000063b000000| PB 0x000000063b000000| Untracked | 0 +|1129|0x000000063b800000, 0x000000063b800000, 0x000000063c000000| 0%| F| |TAMS 0x000000063b800000| PB 0x000000063b800000| Untracked | 0 +|1130|0x000000063c000000, 0x000000063c000000, 0x000000063c800000| 0%| F| |TAMS 0x000000063c000000| PB 0x000000063c000000| Untracked | 0 +|1131|0x000000063c800000, 0x000000063c800000, 0x000000063d000000| 0%| F| |TAMS 0x000000063c800000| PB 0x000000063c800000| Untracked | 0 +|1132|0x000000063d000000, 0x000000063d000000, 0x000000063d800000| 0%| F| |TAMS 0x000000063d000000| PB 0x000000063d000000| Untracked | 0 +|1133|0x000000063d800000, 0x000000063d800000, 0x000000063e000000| 0%| F| |TAMS 0x000000063d800000| PB 0x000000063d800000| Untracked | 0 +|1134|0x000000063e000000, 0x000000063e000000, 0x000000063e800000| 0%| F| |TAMS 0x000000063e000000| PB 0x000000063e000000| Untracked | 0 +|1135|0x000000063e800000, 0x000000063e800000, 0x000000063f000000| 0%| F| |TAMS 0x000000063e800000| PB 0x000000063e800000| Untracked | 0 +|1136|0x000000063f000000, 0x000000063f000000, 0x000000063f800000| 0%| F| |TAMS 0x000000063f000000| PB 0x000000063f000000| Untracked | 0 +|1137|0x000000063f800000, 0x000000063f800000, 0x0000000640000000| 0%| F| |TAMS 0x000000063f800000| PB 0x000000063f800000| Untracked | 0 +|1138|0x0000000640000000, 0x0000000640000000, 0x0000000640800000| 0%| F| |TAMS 0x0000000640000000| PB 0x0000000640000000| Untracked | 0 +|1139|0x0000000640800000, 0x0000000640800000, 0x0000000641000000| 0%| F| |TAMS 0x0000000640800000| PB 0x0000000640800000| Untracked | 0 +|1140|0x0000000641000000, 0x0000000641000000, 0x0000000641800000| 0%| F| |TAMS 0x0000000641000000| PB 0x0000000641000000| Untracked | 0 +|1141|0x0000000641800000, 0x0000000641800000, 0x0000000642000000| 0%| F| |TAMS 0x0000000641800000| PB 0x0000000641800000| Untracked | 0 +|1142|0x0000000642000000, 0x0000000642000000, 0x0000000642800000| 0%| F| |TAMS 0x0000000642000000| PB 0x0000000642000000| Untracked | 0 +|1143|0x0000000642800000, 0x0000000642800000, 0x0000000643000000| 0%| F| |TAMS 0x0000000642800000| PB 0x0000000642800000| Untracked | 0 +|1144|0x0000000643000000, 0x0000000643000000, 0x0000000643800000| 0%| F| |TAMS 0x0000000643000000| PB 0x0000000643000000| Untracked | 0 +|1145|0x0000000643800000, 0x0000000643800000, 0x0000000644000000| 0%| F| |TAMS 0x0000000643800000| PB 0x0000000643800000| Untracked | 0 +|1146|0x0000000644000000, 0x0000000644000000, 0x0000000644800000| 0%| F| |TAMS 0x0000000644000000| PB 0x0000000644000000| Untracked | 0 +|1147|0x0000000644800000, 0x0000000644800000, 0x0000000645000000| 0%| F| |TAMS 0x0000000644800000| PB 0x0000000644800000| Untracked | 0 +|1148|0x0000000645000000, 0x0000000645000000, 0x0000000645800000| 0%| F| |TAMS 0x0000000645000000| PB 0x0000000645000000| Untracked | 0 +|1149|0x0000000645800000, 0x0000000645800000, 0x0000000646000000| 0%| F| |TAMS 0x0000000645800000| PB 0x0000000645800000| Untracked | 0 +|1150|0x0000000646000000, 0x0000000646000000, 0x0000000646800000| 0%| F| |TAMS 0x0000000646000000| PB 0x0000000646000000| Untracked | 0 +|1151|0x0000000646800000, 0x0000000646800000, 0x0000000647000000| 0%| F| |TAMS 0x0000000646800000| PB 0x0000000646800000| Untracked | 0 +|1152|0x0000000647000000, 0x0000000647000000, 0x0000000647800000| 0%| F| |TAMS 0x0000000647000000| PB 0x0000000647000000| Untracked | 0 +|1153|0x0000000647800000, 0x0000000647800000, 0x0000000648000000| 0%| F| |TAMS 0x0000000647800000| PB 0x0000000647800000| Untracked | 0 +|1154|0x0000000648000000, 0x0000000648000000, 0x0000000648800000| 0%| F| |TAMS 0x0000000648000000| PB 0x0000000648000000| Untracked | 0 +|1155|0x0000000648800000, 0x0000000648800000, 0x0000000649000000| 0%| F| |TAMS 0x0000000648800000| PB 0x0000000648800000| Untracked | 0 +|1156|0x0000000649000000, 0x0000000649000000, 0x0000000649800000| 0%| F| |TAMS 0x0000000649000000| PB 0x0000000649000000| Untracked | 0 +|1157|0x0000000649800000, 0x0000000649800000, 0x000000064a000000| 0%| F| |TAMS 0x0000000649800000| PB 0x0000000649800000| Untracked | 0 +|1158|0x000000064a000000, 0x000000064a000000, 0x000000064a800000| 0%| F| |TAMS 0x000000064a000000| PB 0x000000064a000000| Untracked | 0 +|1159|0x000000064a800000, 0x000000064a800000, 0x000000064b000000| 0%| F| |TAMS 0x000000064a800000| PB 0x000000064a800000| Untracked | 0 +|1160|0x000000064b000000, 0x000000064b000000, 0x000000064b800000| 0%| F| |TAMS 0x000000064b000000| PB 0x000000064b000000| Untracked | 0 +|1161|0x000000064b800000, 0x000000064b800000, 0x000000064c000000| 0%| F| |TAMS 0x000000064b800000| PB 0x000000064b800000| Untracked | 0 +|1162|0x000000064c000000, 0x000000064c000000, 0x000000064c800000| 0%| F| |TAMS 0x000000064c000000| PB 0x000000064c000000| Untracked | 0 +|1163|0x000000064c800000, 0x000000064c800000, 0x000000064d000000| 0%| F| |TAMS 0x000000064c800000| PB 0x000000064c800000| Untracked | 0 +|1164|0x000000064d000000, 0x000000064d000000, 0x000000064d800000| 0%| F| |TAMS 0x000000064d000000| PB 0x000000064d000000| Untracked | 0 +|1165|0x000000064d800000, 0x000000064d800000, 0x000000064e000000| 0%| F| |TAMS 0x000000064d800000| PB 0x000000064d800000| Untracked | 0 +|1166|0x000000064e000000, 0x000000064e000000, 0x000000064e800000| 0%| F| |TAMS 0x000000064e000000| PB 0x000000064e000000| Untracked | 0 +|1167|0x000000064e800000, 0x000000064e800000, 0x000000064f000000| 0%| F| |TAMS 0x000000064e800000| PB 0x000000064e800000| Untracked | 0 +|1168|0x000000064f000000, 0x000000064f000000, 0x000000064f800000| 0%| F| |TAMS 0x000000064f000000| PB 0x000000064f000000| Untracked | 0 +|1169|0x000000064f800000, 0x000000064f800000, 0x0000000650000000| 0%| F| |TAMS 0x000000064f800000| PB 0x000000064f800000| Untracked | 0 +|1170|0x0000000650000000, 0x0000000650000000, 0x0000000650800000| 0%| F| |TAMS 0x0000000650000000| PB 0x0000000650000000| Untracked | 0 +|1171|0x0000000650800000, 0x0000000650800000, 0x0000000651000000| 0%| F| |TAMS 0x0000000650800000| PB 0x0000000650800000| Untracked | 0 +|1172|0x0000000651000000, 0x0000000651000000, 0x0000000651800000| 0%| F| |TAMS 0x0000000651000000| PB 0x0000000651000000| Untracked | 0 +|1173|0x0000000651800000, 0x0000000651800000, 0x0000000652000000| 0%| F| |TAMS 0x0000000651800000| PB 0x0000000651800000| Untracked | 0 +|1174|0x0000000652000000, 0x0000000652000000, 0x0000000652800000| 0%| F| |TAMS 0x0000000652000000| PB 0x0000000652000000| Untracked | 0 +|1175|0x0000000652800000, 0x0000000652800000, 0x0000000653000000| 0%| F| |TAMS 0x0000000652800000| PB 0x0000000652800000| Untracked | 0 +|1176|0x0000000653000000, 0x0000000653000000, 0x0000000653800000| 0%| F| |TAMS 0x0000000653000000| PB 0x0000000653000000| Untracked | 0 +|1177|0x0000000653800000, 0x0000000653800000, 0x0000000654000000| 0%| F| |TAMS 0x0000000653800000| PB 0x0000000653800000| Untracked | 0 +|1178|0x0000000654000000, 0x0000000654000000, 0x0000000654800000| 0%| F| |TAMS 0x0000000654000000| PB 0x0000000654000000| Untracked | 0 +|1179|0x0000000654800000, 0x0000000654800000, 0x0000000655000000| 0%| F| |TAMS 0x0000000654800000| PB 0x0000000654800000| Untracked | 0 +|1180|0x0000000655000000, 0x0000000655000000, 0x0000000655800000| 0%| F| |TAMS 0x0000000655000000| PB 0x0000000655000000| Untracked | 0 +|1181|0x0000000655800000, 0x0000000655800000, 0x0000000656000000| 0%| F| |TAMS 0x0000000655800000| PB 0x0000000655800000| Untracked | 0 +|1182|0x0000000656000000, 0x0000000656000000, 0x0000000656800000| 0%| F| |TAMS 0x0000000656000000| PB 0x0000000656000000| Untracked | 0 +|1183|0x0000000656800000, 0x0000000656800000, 0x0000000657000000| 0%| F| |TAMS 0x0000000656800000| PB 0x0000000656800000| Untracked | 0 +|1184|0x0000000657000000, 0x0000000657000000, 0x0000000657800000| 0%| F| |TAMS 0x0000000657000000| PB 0x0000000657000000| Untracked | 0 +|1185|0x0000000657800000, 0x0000000657800000, 0x0000000658000000| 0%| F| |TAMS 0x0000000657800000| PB 0x0000000657800000| Untracked | 0 +|1186|0x0000000658000000, 0x0000000658000000, 0x0000000658800000| 0%| F| |TAMS 0x0000000658000000| PB 0x0000000658000000| Untracked | 0 +|1187|0x0000000658800000, 0x0000000658800000, 0x0000000659000000| 0%| F| |TAMS 0x0000000658800000| PB 0x0000000658800000| Untracked | 0 +|1188|0x0000000659000000, 0x0000000659000000, 0x0000000659800000| 0%| F| |TAMS 0x0000000659000000| PB 0x0000000659000000| Untracked | 0 +|1189|0x0000000659800000, 0x0000000659800000, 0x000000065a000000| 0%| F| |TAMS 0x0000000659800000| PB 0x0000000659800000| Untracked | 0 +|1190|0x000000065a000000, 0x000000065a000000, 0x000000065a800000| 0%| F| |TAMS 0x000000065a000000| PB 0x000000065a000000| Untracked | 0 +|1191|0x000000065a800000, 0x000000065a800000, 0x000000065b000000| 0%| F| |TAMS 0x000000065a800000| PB 0x000000065a800000| Untracked | 0 +|1192|0x000000065b000000, 0x000000065b000000, 0x000000065b800000| 0%| F| |TAMS 0x000000065b000000| PB 0x000000065b000000| Untracked | 0 +|1193|0x000000065b800000, 0x000000065b800000, 0x000000065c000000| 0%| F| |TAMS 0x000000065b800000| PB 0x000000065b800000| Untracked | 0 +|1194|0x000000065c000000, 0x000000065c000000, 0x000000065c800000| 0%| F| |TAMS 0x000000065c000000| PB 0x000000065c000000| Untracked | 0 +|1195|0x000000065c800000, 0x000000065c800000, 0x000000065d000000| 0%| F| |TAMS 0x000000065c800000| PB 0x000000065c800000| Untracked | 0 +|1196|0x000000065d000000, 0x000000065d000000, 0x000000065d800000| 0%| F| |TAMS 0x000000065d000000| PB 0x000000065d000000| Untracked | 0 +|1197|0x000000065d800000, 0x000000065d800000, 0x000000065e000000| 0%| F| |TAMS 0x000000065d800000| PB 0x000000065d800000| Untracked | 0 +|1198|0x000000065e000000, 0x000000065e000000, 0x000000065e800000| 0%| F| |TAMS 0x000000065e000000| PB 0x000000065e000000| Untracked | 0 +|1199|0x000000065e800000, 0x000000065e800000, 0x000000065f000000| 0%| F| |TAMS 0x000000065e800000| PB 0x000000065e800000| Untracked | 0 +|1200|0x000000065f000000, 0x000000065f000000, 0x000000065f800000| 0%| F| |TAMS 0x000000065f000000| PB 0x000000065f000000| Untracked | 0 +|1201|0x000000065f800000, 0x000000065f800000, 0x0000000660000000| 0%| F| |TAMS 0x000000065f800000| PB 0x000000065f800000| Untracked | 0 +|1202|0x0000000660000000, 0x0000000660000000, 0x0000000660800000| 0%| F| |TAMS 0x0000000660000000| PB 0x0000000660000000| Untracked | 0 +|1203|0x0000000660800000, 0x0000000660800000, 0x0000000661000000| 0%| F| |TAMS 0x0000000660800000| PB 0x0000000660800000| Untracked | 0 +|1204|0x0000000661000000, 0x0000000661000000, 0x0000000661800000| 0%| F| |TAMS 0x0000000661000000| PB 0x0000000661000000| Untracked | 0 +|1205|0x0000000661800000, 0x0000000661800000, 0x0000000662000000| 0%| F| |TAMS 0x0000000661800000| PB 0x0000000661800000| Untracked | 0 +|1206|0x0000000662000000, 0x0000000662000000, 0x0000000662800000| 0%| F| |TAMS 0x0000000662000000| PB 0x0000000662000000| Untracked | 0 +|1207|0x0000000662800000, 0x0000000662800000, 0x0000000663000000| 0%| F| |TAMS 0x0000000662800000| PB 0x0000000662800000| Untracked | 0 +|1208|0x0000000663000000, 0x0000000663000000, 0x0000000663800000| 0%| F| |TAMS 0x0000000663000000| PB 0x0000000663000000| Untracked | 0 +|1209|0x0000000663800000, 0x0000000663800000, 0x0000000664000000| 0%| F| |TAMS 0x0000000663800000| PB 0x0000000663800000| Untracked | 0 +|1210|0x0000000664000000, 0x0000000664000000, 0x0000000664800000| 0%| F| |TAMS 0x0000000664000000| PB 0x0000000664000000| Untracked | 0 +|1211|0x0000000664800000, 0x0000000664800000, 0x0000000665000000| 0%| F| |TAMS 0x0000000664800000| PB 0x0000000664800000| Untracked | 0 +|1212|0x0000000665000000, 0x0000000665000000, 0x0000000665800000| 0%| F| |TAMS 0x0000000665000000| PB 0x0000000665000000| Untracked | 0 +|1213|0x0000000665800000, 0x0000000665800000, 0x0000000666000000| 0%| F| |TAMS 0x0000000665800000| PB 0x0000000665800000| Untracked | 0 +|1214|0x0000000666000000, 0x0000000666000000, 0x0000000666800000| 0%| F| |TAMS 0x0000000666000000| PB 0x0000000666000000| Untracked | 0 +|1215|0x0000000666800000, 0x0000000666800000, 0x0000000667000000| 0%| F| |TAMS 0x0000000666800000| PB 0x0000000666800000| Untracked | 0 +|1216|0x0000000667000000, 0x0000000667000000, 0x0000000667800000| 0%| F| |TAMS 0x0000000667000000| PB 0x0000000667000000| Untracked | 0 +|1217|0x0000000667800000, 0x0000000667800000, 0x0000000668000000| 0%| F| |TAMS 0x0000000667800000| PB 0x0000000667800000| Untracked | 0 +|1218|0x0000000668000000, 0x0000000668000000, 0x0000000668800000| 0%| F| |TAMS 0x0000000668000000| PB 0x0000000668000000| Untracked | 0 +|1219|0x0000000668800000, 0x0000000668800000, 0x0000000669000000| 0%| F| |TAMS 0x0000000668800000| PB 0x0000000668800000| Untracked | 0 +|1220|0x0000000669000000, 0x0000000669000000, 0x0000000669800000| 0%| F| |TAMS 0x0000000669000000| PB 0x0000000669000000| Untracked | 0 +|1221|0x0000000669800000, 0x0000000669800000, 0x000000066a000000| 0%| F| |TAMS 0x0000000669800000| PB 0x0000000669800000| Untracked | 0 +|1222|0x000000066a000000, 0x000000066a000000, 0x000000066a800000| 0%| F| |TAMS 0x000000066a000000| PB 0x000000066a000000| Untracked | 0 +|1223|0x000000066a800000, 0x000000066a800000, 0x000000066b000000| 0%| F| |TAMS 0x000000066a800000| PB 0x000000066a800000| Untracked | 0 +|1224|0x000000066b000000, 0x000000066b000000, 0x000000066b800000| 0%| F| |TAMS 0x000000066b000000| PB 0x000000066b000000| Untracked | 0 +|1225|0x000000066b800000, 0x000000066b800000, 0x000000066c000000| 0%| F| |TAMS 0x000000066b800000| PB 0x000000066b800000| Untracked | 0 +|1226|0x000000066c000000, 0x000000066c000000, 0x000000066c800000| 0%| F| |TAMS 0x000000066c000000| PB 0x000000066c000000| Untracked | 0 +|1227|0x000000066c800000, 0x000000066c800000, 0x000000066d000000| 0%| F| |TAMS 0x000000066c800000| PB 0x000000066c800000| Untracked | 0 +|1228|0x000000066d000000, 0x000000066d000000, 0x000000066d800000| 0%| F| |TAMS 0x000000066d000000| PB 0x000000066d000000| Untracked | 0 +|1229|0x000000066d800000, 0x000000066d800000, 0x000000066e000000| 0%| F| |TAMS 0x000000066d800000| PB 0x000000066d800000| Untracked | 0 +|1230|0x000000066e000000, 0x000000066e000000, 0x000000066e800000| 0%| F| |TAMS 0x000000066e000000| PB 0x000000066e000000| Untracked | 0 +|1231|0x000000066e800000, 0x000000066e800000, 0x000000066f000000| 0%| F| |TAMS 0x000000066e800000| PB 0x000000066e800000| Untracked | 0 +|1232|0x000000066f000000, 0x000000066f000000, 0x000000066f800000| 0%| F| |TAMS 0x000000066f000000| PB 0x000000066f000000| Untracked | 0 +|1233|0x000000066f800000, 0x000000066f800000, 0x0000000670000000| 0%| F| |TAMS 0x000000066f800000| PB 0x000000066f800000| Untracked | 0 +|1234|0x0000000670000000, 0x0000000670000000, 0x0000000670800000| 0%| F| |TAMS 0x0000000670000000| PB 0x0000000670000000| Untracked | 0 +|1235|0x0000000670800000, 0x0000000670800000, 0x0000000671000000| 0%| F| |TAMS 0x0000000670800000| PB 0x0000000670800000| Untracked | 0 +|1236|0x0000000671000000, 0x0000000671000000, 0x0000000671800000| 0%| F| |TAMS 0x0000000671000000| PB 0x0000000671000000| Untracked | 0 +|1237|0x0000000671800000, 0x0000000671800000, 0x0000000672000000| 0%| F| |TAMS 0x0000000671800000| PB 0x0000000671800000| Untracked | 0 +|1238|0x0000000672000000, 0x0000000672000000, 0x0000000672800000| 0%| F| |TAMS 0x0000000672000000| PB 0x0000000672000000| Untracked | 0 +|1239|0x0000000672800000, 0x0000000672800000, 0x0000000673000000| 0%| F| |TAMS 0x0000000672800000| PB 0x0000000672800000| Untracked | 0 +|1240|0x0000000673000000, 0x0000000673000000, 0x0000000673800000| 0%| F| |TAMS 0x0000000673000000| PB 0x0000000673000000| Untracked | 0 +|1241|0x0000000673800000, 0x0000000673800000, 0x0000000674000000| 0%| F| |TAMS 0x0000000673800000| PB 0x0000000673800000| Untracked | 0 +|1242|0x0000000674000000, 0x0000000674000000, 0x0000000674800000| 0%| F| |TAMS 0x0000000674000000| PB 0x0000000674000000| Untracked | 0 +|1243|0x0000000674800000, 0x0000000674800000, 0x0000000675000000| 0%| F| |TAMS 0x0000000674800000| PB 0x0000000674800000| Untracked | 0 +|1244|0x0000000675000000, 0x0000000675000000, 0x0000000675800000| 0%| F| |TAMS 0x0000000675000000| PB 0x0000000675000000| Untracked | 0 +|1245|0x0000000675800000, 0x0000000675800000, 0x0000000676000000| 0%| F| |TAMS 0x0000000675800000| PB 0x0000000675800000| Untracked | 0 +|1246|0x0000000676000000, 0x0000000676000000, 0x0000000676800000| 0%| F| |TAMS 0x0000000676000000| PB 0x0000000676000000| Untracked | 0 +|1247|0x0000000676800000, 0x0000000676800000, 0x0000000677000000| 0%| F| |TAMS 0x0000000676800000| PB 0x0000000676800000| Untracked | 0 +|1248|0x0000000677000000, 0x0000000677000000, 0x0000000677800000| 0%| F| |TAMS 0x0000000677000000| PB 0x0000000677000000| Untracked | 0 +|1249|0x0000000677800000, 0x0000000677800000, 0x0000000678000000| 0%| F| |TAMS 0x0000000677800000| PB 0x0000000677800000| Untracked | 0 +|1250|0x0000000678000000, 0x0000000678000000, 0x0000000678800000| 0%| F| |TAMS 0x0000000678000000| PB 0x0000000678000000| Untracked | 0 +|1251|0x0000000678800000, 0x0000000678800000, 0x0000000679000000| 0%| F| |TAMS 0x0000000678800000| PB 0x0000000678800000| Untracked | 0 +|1252|0x0000000679000000, 0x0000000679000000, 0x0000000679800000| 0%| F| |TAMS 0x0000000679000000| PB 0x0000000679000000| Untracked | 0 +|1253|0x0000000679800000, 0x0000000679800000, 0x000000067a000000| 0%| F| |TAMS 0x0000000679800000| PB 0x0000000679800000| Untracked | 0 +|1254|0x000000067a000000, 0x000000067a000000, 0x000000067a800000| 0%| F| |TAMS 0x000000067a000000| PB 0x000000067a000000| Untracked | 0 +|1255|0x000000067a800000, 0x000000067a800000, 0x000000067b000000| 0%| F| |TAMS 0x000000067a800000| PB 0x000000067a800000| Untracked | 0 +|1256|0x000000067b000000, 0x000000067b000000, 0x000000067b800000| 0%| F| |TAMS 0x000000067b000000| PB 0x000000067b000000| Untracked | 0 +|1257|0x000000067b800000, 0x000000067b800000, 0x000000067c000000| 0%| F| |TAMS 0x000000067b800000| PB 0x000000067b800000| Untracked | 0 +|1258|0x000000067c000000, 0x000000067c000000, 0x000000067c800000| 0%| F| |TAMS 0x000000067c000000| PB 0x000000067c000000| Untracked | 0 +|1259|0x000000067c800000, 0x000000067c800000, 0x000000067d000000| 0%| F| |TAMS 0x000000067c800000| PB 0x000000067c800000| Untracked | 0 +|1260|0x000000067d000000, 0x000000067d000000, 0x000000067d800000| 0%| F| |TAMS 0x000000067d000000| PB 0x000000067d000000| Untracked | 0 +|1261|0x000000067d800000, 0x000000067d800000, 0x000000067e000000| 0%| F| |TAMS 0x000000067d800000| PB 0x000000067d800000| Untracked | 0 +|1262|0x000000067e000000, 0x000000067e000000, 0x000000067e800000| 0%| F| |TAMS 0x000000067e000000| PB 0x000000067e000000| Untracked | 0 +|1263|0x000000067e800000, 0x000000067e800000, 0x000000067f000000| 0%| F| |TAMS 0x000000067e800000| PB 0x000000067e800000| Untracked | 0 +|1264|0x000000067f000000, 0x000000067f000000, 0x000000067f800000| 0%| F| |TAMS 0x000000067f000000| PB 0x000000067f000000| Untracked | 0 +|1265|0x000000067f800000, 0x000000067f800000, 0x0000000680000000| 0%| F| |TAMS 0x000000067f800000| PB 0x000000067f800000| Untracked | 0 +|1266|0x0000000680000000, 0x0000000680000000, 0x0000000680800000| 0%| F| |TAMS 0x0000000680000000| PB 0x0000000680000000| Untracked | 0 +|1267|0x0000000680800000, 0x0000000680800000, 0x0000000681000000| 0%| F| |TAMS 0x0000000680800000| PB 0x0000000680800000| Untracked | 0 +|1268|0x0000000681000000, 0x0000000681000000, 0x0000000681800000| 0%| F| |TAMS 0x0000000681000000| PB 0x0000000681000000| Untracked | 0 +|1269|0x0000000681800000, 0x0000000681800000, 0x0000000682000000| 0%| F| |TAMS 0x0000000681800000| PB 0x0000000681800000| Untracked | 0 +|1270|0x0000000682000000, 0x0000000682000000, 0x0000000682800000| 0%| F| |TAMS 0x0000000682000000| PB 0x0000000682000000| Untracked | 0 +|1271|0x0000000682800000, 0x0000000682800000, 0x0000000683000000| 0%| F| |TAMS 0x0000000682800000| PB 0x0000000682800000| Untracked | 0 +|1272|0x0000000683000000, 0x0000000683000000, 0x0000000683800000| 0%| F| |TAMS 0x0000000683000000| PB 0x0000000683000000| Untracked | 0 +|1273|0x0000000683800000, 0x0000000683800000, 0x0000000684000000| 0%| F| |TAMS 0x0000000683800000| PB 0x0000000683800000| Untracked | 0 +|1274|0x0000000684000000, 0x0000000684000000, 0x0000000684800000| 0%| F| |TAMS 0x0000000684000000| PB 0x0000000684000000| Untracked | 0 +|1275|0x0000000684800000, 0x0000000684800000, 0x0000000685000000| 0%| F| |TAMS 0x0000000684800000| PB 0x0000000684800000| Untracked | 0 +|1276|0x0000000685000000, 0x0000000685000000, 0x0000000685800000| 0%| F| |TAMS 0x0000000685000000| PB 0x0000000685000000| Untracked | 0 +|1277|0x0000000685800000, 0x0000000685800000, 0x0000000686000000| 0%| F| |TAMS 0x0000000685800000| PB 0x0000000685800000| Untracked | 0 +|1278|0x0000000686000000, 0x0000000686000000, 0x0000000686800000| 0%| F| |TAMS 0x0000000686000000| PB 0x0000000686000000| Untracked | 0 +|1279|0x0000000686800000, 0x0000000686800000, 0x0000000687000000| 0%| F| |TAMS 0x0000000686800000| PB 0x0000000686800000| Untracked | 0 +|1280|0x0000000687000000, 0x0000000687000000, 0x0000000687800000| 0%| F| |TAMS 0x0000000687000000| PB 0x0000000687000000| Untracked | 0 +|1281|0x0000000687800000, 0x0000000687800000, 0x0000000688000000| 0%| F| |TAMS 0x0000000687800000| PB 0x0000000687800000| Untracked | 0 +|1282|0x0000000688000000, 0x0000000688000000, 0x0000000688800000| 0%| F| |TAMS 0x0000000688000000| PB 0x0000000688000000| Untracked | 0 +|1283|0x0000000688800000, 0x0000000688800000, 0x0000000689000000| 0%| F| |TAMS 0x0000000688800000| PB 0x0000000688800000| Untracked | 0 +|1284|0x0000000689000000, 0x0000000689000000, 0x0000000689800000| 0%| F| |TAMS 0x0000000689000000| PB 0x0000000689000000| Untracked | 0 +|1285|0x0000000689800000, 0x0000000689800000, 0x000000068a000000| 0%| F| |TAMS 0x0000000689800000| PB 0x0000000689800000| Untracked | 0 +|1286|0x000000068a000000, 0x000000068a000000, 0x000000068a800000| 0%| F| |TAMS 0x000000068a000000| PB 0x000000068a000000| Untracked | 0 +|1287|0x000000068a800000, 0x000000068a800000, 0x000000068b000000| 0%| F| |TAMS 0x000000068a800000| PB 0x000000068a800000| Untracked | 0 +|1288|0x000000068b000000, 0x000000068b000000, 0x000000068b800000| 0%| F| |TAMS 0x000000068b000000| PB 0x000000068b000000| Untracked | 0 +|1289|0x000000068b800000, 0x000000068b800000, 0x000000068c000000| 0%| F| |TAMS 0x000000068b800000| PB 0x000000068b800000| Untracked | 0 +|1290|0x000000068c000000, 0x000000068c000000, 0x000000068c800000| 0%| F| |TAMS 0x000000068c000000| PB 0x000000068c000000| Untracked | 0 +|1291|0x000000068c800000, 0x000000068c800000, 0x000000068d000000| 0%| F| |TAMS 0x000000068c800000| PB 0x000000068c800000| Untracked | 0 +|1292|0x000000068d000000, 0x000000068d000000, 0x000000068d800000| 0%| F| |TAMS 0x000000068d000000| PB 0x000000068d000000| Untracked | 0 +|1293|0x000000068d800000, 0x000000068d800000, 0x000000068e000000| 0%| F| |TAMS 0x000000068d800000| PB 0x000000068d800000| Untracked | 0 +|1294|0x000000068e000000, 0x000000068e000000, 0x000000068e800000| 0%| F| |TAMS 0x000000068e000000| PB 0x000000068e000000| Untracked | 0 +|1295|0x000000068e800000, 0x000000068e800000, 0x000000068f000000| 0%| F| |TAMS 0x000000068e800000| PB 0x000000068e800000| Untracked | 0 +|1296|0x000000068f000000, 0x000000068f000000, 0x000000068f800000| 0%| F| |TAMS 0x000000068f000000| PB 0x000000068f000000| Untracked | 0 +|1297|0x000000068f800000, 0x000000068f800000, 0x0000000690000000| 0%| F| |TAMS 0x000000068f800000| PB 0x000000068f800000| Untracked | 0 +|1298|0x0000000690000000, 0x0000000690000000, 0x0000000690800000| 0%| F| |TAMS 0x0000000690000000| PB 0x0000000690000000| Untracked | 0 +|1299|0x0000000690800000, 0x0000000690800000, 0x0000000691000000| 0%| F| |TAMS 0x0000000690800000| PB 0x0000000690800000| Untracked | 0 +|1300|0x0000000691000000, 0x0000000691000000, 0x0000000691800000| 0%| F| |TAMS 0x0000000691000000| PB 0x0000000691000000| Untracked | 0 +|1301|0x0000000691800000, 0x0000000691800000, 0x0000000692000000| 0%| F| |TAMS 0x0000000691800000| PB 0x0000000691800000| Untracked | 0 +|1302|0x0000000692000000, 0x0000000692000000, 0x0000000692800000| 0%| F| |TAMS 0x0000000692000000| PB 0x0000000692000000| Untracked | 0 +|1303|0x0000000692800000, 0x0000000692800000, 0x0000000693000000| 0%| F| |TAMS 0x0000000692800000| PB 0x0000000692800000| Untracked | 0 +|1304|0x0000000693000000, 0x0000000693000000, 0x0000000693800000| 0%| F| |TAMS 0x0000000693000000| PB 0x0000000693000000| Untracked | 0 +|1305|0x0000000693800000, 0x0000000693800000, 0x0000000694000000| 0%| F| |TAMS 0x0000000693800000| PB 0x0000000693800000| Untracked | 0 +|1306|0x0000000694000000, 0x0000000694000000, 0x0000000694800000| 0%| F| |TAMS 0x0000000694000000| PB 0x0000000694000000| Untracked | 0 +|1307|0x0000000694800000, 0x0000000694800000, 0x0000000695000000| 0%| F| |TAMS 0x0000000694800000| PB 0x0000000694800000| Untracked | 0 +|1308|0x0000000695000000, 0x0000000695000000, 0x0000000695800000| 0%| F| |TAMS 0x0000000695000000| PB 0x0000000695000000| Untracked | 0 +|1309|0x0000000695800000, 0x0000000695800000, 0x0000000696000000| 0%| F| |TAMS 0x0000000695800000| PB 0x0000000695800000| Untracked | 0 +|1310|0x0000000696000000, 0x0000000696000000, 0x0000000696800000| 0%| F| |TAMS 0x0000000696000000| PB 0x0000000696000000| Untracked | 0 +|1311|0x0000000696800000, 0x0000000696800000, 0x0000000697000000| 0%| F| |TAMS 0x0000000696800000| PB 0x0000000696800000| Untracked | 0 +|1312|0x0000000697000000, 0x0000000697000000, 0x0000000697800000| 0%| F| |TAMS 0x0000000697000000| PB 0x0000000697000000| Untracked | 0 +|1313|0x0000000697800000, 0x0000000697800000, 0x0000000698000000| 0%| F| |TAMS 0x0000000697800000| PB 0x0000000697800000| Untracked | 0 +|1314|0x0000000698000000, 0x0000000698000000, 0x0000000698800000| 0%| F| |TAMS 0x0000000698000000| PB 0x0000000698000000| Untracked | 0 +|1315|0x0000000698800000, 0x0000000698800000, 0x0000000699000000| 0%| F| |TAMS 0x0000000698800000| PB 0x0000000698800000| Untracked | 0 +|1316|0x0000000699000000, 0x0000000699000000, 0x0000000699800000| 0%| F| |TAMS 0x0000000699000000| PB 0x0000000699000000| Untracked | 0 +|1317|0x0000000699800000, 0x0000000699800000, 0x000000069a000000| 0%| F| |TAMS 0x0000000699800000| PB 0x0000000699800000| Untracked | 0 +|1318|0x000000069a000000, 0x000000069a000000, 0x000000069a800000| 0%| F| |TAMS 0x000000069a000000| PB 0x000000069a000000| Untracked | 0 +|1319|0x000000069a800000, 0x000000069a800000, 0x000000069b000000| 0%| F| |TAMS 0x000000069a800000| PB 0x000000069a800000| Untracked | 0 +|1320|0x000000069b000000, 0x000000069b000000, 0x000000069b800000| 0%| F| |TAMS 0x000000069b000000| PB 0x000000069b000000| Untracked | 0 +|1321|0x000000069b800000, 0x000000069b800000, 0x000000069c000000| 0%| F| |TAMS 0x000000069b800000| PB 0x000000069b800000| Untracked | 0 +|1322|0x000000069c000000, 0x000000069c000000, 0x000000069c800000| 0%| F| |TAMS 0x000000069c000000| PB 0x000000069c000000| Untracked | 0 +|1323|0x000000069c800000, 0x000000069c800000, 0x000000069d000000| 0%| F| |TAMS 0x000000069c800000| PB 0x000000069c800000| Untracked | 0 +|1324|0x000000069d000000, 0x000000069d000000, 0x000000069d800000| 0%| F| |TAMS 0x000000069d000000| PB 0x000000069d000000| Untracked | 0 +|1325|0x000000069d800000, 0x000000069d800000, 0x000000069e000000| 0%| F| |TAMS 0x000000069d800000| PB 0x000000069d800000| Untracked | 0 +|1326|0x000000069e000000, 0x000000069e000000, 0x000000069e800000| 0%| F| |TAMS 0x000000069e000000| PB 0x000000069e000000| Untracked | 0 +|1327|0x000000069e800000, 0x000000069e800000, 0x000000069f000000| 0%| F| |TAMS 0x000000069e800000| PB 0x000000069e800000| Untracked | 0 +|1328|0x000000069f000000, 0x000000069f000000, 0x000000069f800000| 0%| F| |TAMS 0x000000069f000000| PB 0x000000069f000000| Untracked | 0 +|1329|0x000000069f800000, 0x000000069f800000, 0x00000006a0000000| 0%| F| |TAMS 0x000000069f800000| PB 0x000000069f800000| Untracked | 0 +|1330|0x00000006a0000000, 0x00000006a0000000, 0x00000006a0800000| 0%| F| |TAMS 0x00000006a0000000| PB 0x00000006a0000000| Untracked | 0 +|1331|0x00000006a0800000, 0x00000006a0800000, 0x00000006a1000000| 0%| F| |TAMS 0x00000006a0800000| PB 0x00000006a0800000| Untracked | 0 +|1332|0x00000006a1000000, 0x00000006a1000000, 0x00000006a1800000| 0%| F| |TAMS 0x00000006a1000000| PB 0x00000006a1000000| Untracked | 0 +|1333|0x00000006a1800000, 0x00000006a1800000, 0x00000006a2000000| 0%| F| |TAMS 0x00000006a1800000| PB 0x00000006a1800000| Untracked | 0 +|1334|0x00000006a2000000, 0x00000006a2000000, 0x00000006a2800000| 0%| F| |TAMS 0x00000006a2000000| PB 0x00000006a2000000| Untracked | 0 +|1335|0x00000006a2800000, 0x00000006a2800000, 0x00000006a3000000| 0%| F| |TAMS 0x00000006a2800000| PB 0x00000006a2800000| Untracked | 0 +|1336|0x00000006a3000000, 0x00000006a3000000, 0x00000006a3800000| 0%| F| |TAMS 0x00000006a3000000| PB 0x00000006a3000000| Untracked | 0 +|1337|0x00000006a3800000, 0x00000006a3800000, 0x00000006a4000000| 0%| F| |TAMS 0x00000006a3800000| PB 0x00000006a3800000| Untracked | 0 +|1338|0x00000006a4000000, 0x00000006a4000000, 0x00000006a4800000| 0%| F| |TAMS 0x00000006a4000000| PB 0x00000006a4000000| Untracked | 0 +|1339|0x00000006a4800000, 0x00000006a4800000, 0x00000006a5000000| 0%| F| |TAMS 0x00000006a4800000| PB 0x00000006a4800000| Untracked | 0 +|1340|0x00000006a5000000, 0x00000006a5000000, 0x00000006a5800000| 0%| F| |TAMS 0x00000006a5000000| PB 0x00000006a5000000| Untracked | 0 +|1341|0x00000006a5800000, 0x00000006a5800000, 0x00000006a6000000| 0%| F| |TAMS 0x00000006a5800000| PB 0x00000006a5800000| Untracked | 0 +|1342|0x00000006a6000000, 0x00000006a6000000, 0x00000006a6800000| 0%| F| |TAMS 0x00000006a6000000| PB 0x00000006a6000000| Untracked | 0 +|1343|0x00000006a6800000, 0x00000006a6800000, 0x00000006a7000000| 0%| F| |TAMS 0x00000006a6800000| PB 0x00000006a6800000| Untracked | 0 +|1344|0x00000006a7000000, 0x00000006a7000000, 0x00000006a7800000| 0%| F| |TAMS 0x00000006a7000000| PB 0x00000006a7000000| Untracked | 0 +|1345|0x00000006a7800000, 0x00000006a8000000, 0x00000006a8000000|100%| S|CS|TAMS 0x00000006a7800000| PB 0x00000006a7800000| Complete | 0 +|1346|0x00000006a8000000, 0x00000006a8800000, 0x00000006a8800000|100%| S|CS|TAMS 0x00000006a8000000| PB 0x00000006a8000000| Complete | 0 +|1347|0x00000006a8800000, 0x00000006a9000000, 0x00000006a9000000|100%| S|CS|TAMS 0x00000006a8800000| PB 0x00000006a8800000| Complete | 0 +|1348|0x00000006a9000000, 0x00000006a9800000, 0x00000006a9800000|100%| S|CS|TAMS 0x00000006a9000000| PB 0x00000006a9000000| Complete | 0 +|1349|0x00000006a9800000, 0x00000006aa000000, 0x00000006aa000000|100%| S|CS|TAMS 0x00000006a9800000| PB 0x00000006a9800000| Complete | 0 +|1350|0x00000006aa000000, 0x00000006aa800000, 0x00000006aa800000|100%| S|CS|TAMS 0x00000006aa000000| PB 0x00000006aa000000| Complete | 0 +|1351|0x00000006aa800000, 0x00000006ab000000, 0x00000006ab000000|100%| S|CS|TAMS 0x00000006aa800000| PB 0x00000006aa800000| Complete | 0 +|1352|0x00000006ab000000, 0x00000006ab800000, 0x00000006ab800000|100%| S|CS|TAMS 0x00000006ab000000| PB 0x00000006ab000000| Complete | 0 +|1353|0x00000006ab800000, 0x00000006ac000000, 0x00000006ac000000|100%| S|CS|TAMS 0x00000006ab800000| PB 0x00000006ab800000| Complete | 0 +|1354|0x00000006ac000000, 0x00000006ac000000, 0x00000006ac800000| 0%| F| |TAMS 0x00000006ac000000| PB 0x00000006ac000000| Untracked | 0 +|1355|0x00000006ac800000, 0x00000006ac800000, 0x00000006ad000000| 0%| F| |TAMS 0x00000006ac800000| PB 0x00000006ac800000| Untracked | 0 +|1356|0x00000006ad000000, 0x00000006ad000000, 0x00000006ad800000| 0%| F| |TAMS 0x00000006ad000000| PB 0x00000006ad000000| Untracked | 0 +|1357|0x00000006ad800000, 0x00000006ad800000, 0x00000006ae000000| 0%| F| |TAMS 0x00000006ad800000| PB 0x00000006ad800000| Untracked | 0 +|1358|0x00000006ae000000, 0x00000006ae000000, 0x00000006ae800000| 0%| F| |TAMS 0x00000006ae000000| PB 0x00000006ae000000| Untracked | 0 +|1359|0x00000006ae800000, 0x00000006ae800000, 0x00000006af000000| 0%| F| |TAMS 0x00000006ae800000| PB 0x00000006ae800000| Untracked | 0 +|1360|0x00000006af000000, 0x00000006af000000, 0x00000006af800000| 0%| F| |TAMS 0x00000006af000000| PB 0x00000006af000000| Untracked | 0 +|1361|0x00000006af800000, 0x00000006af800000, 0x00000006b0000000| 0%| F| |TAMS 0x00000006af800000| PB 0x00000006af800000| Untracked | 0 +|1362|0x00000006b0000000, 0x00000006b0000000, 0x00000006b0800000| 0%| F| |TAMS 0x00000006b0000000| PB 0x00000006b0000000| Untracked | 0 +|1363|0x00000006b0800000, 0x00000006b0800000, 0x00000006b1000000| 0%| F| |TAMS 0x00000006b0800000| PB 0x00000006b0800000| Untracked | 0 +|1364|0x00000006b1000000, 0x00000006b1000000, 0x00000006b1800000| 0%| F| |TAMS 0x00000006b1000000| PB 0x00000006b1000000| Untracked | 0 +|1365|0x00000006b1800000, 0x00000006b1800000, 0x00000006b2000000| 0%| F| |TAMS 0x00000006b1800000| PB 0x00000006b1800000| Untracked | 0 +|1366|0x00000006b2000000, 0x00000006b2000000, 0x00000006b2800000| 0%| F| |TAMS 0x00000006b2000000| PB 0x00000006b2000000| Untracked | 0 +|1367|0x00000006b2800000, 0x00000006b2800000, 0x00000006b3000000| 0%| F| |TAMS 0x00000006b2800000| PB 0x00000006b2800000| Untracked | 0 +|1368|0x00000006b3000000, 0x00000006b3000000, 0x00000006b3800000| 0%| F| |TAMS 0x00000006b3000000| PB 0x00000006b3000000| Untracked | 0 +|1369|0x00000006b3800000, 0x00000006b3800000, 0x00000006b4000000| 0%| F| |TAMS 0x00000006b3800000| PB 0x00000006b3800000| Untracked | 0 +|1370|0x00000006b4000000, 0x00000006b4000000, 0x00000006b4800000| 0%| F| |TAMS 0x00000006b4000000| PB 0x00000006b4000000| Untracked | 0 +|1371|0x00000006b4800000, 0x00000006b4800000, 0x00000006b5000000| 0%| F| |TAMS 0x00000006b4800000| PB 0x00000006b4800000| Untracked | 0 +|1372|0x00000006b5000000, 0x00000006b5000000, 0x00000006b5800000| 0%| F| |TAMS 0x00000006b5000000| PB 0x00000006b5000000| Untracked | 0 +|1373|0x00000006b5800000, 0x00000006b5800000, 0x00000006b6000000| 0%| F| |TAMS 0x00000006b5800000| PB 0x00000006b5800000| Untracked | 0 +|1374|0x00000006b6000000, 0x00000006b6000000, 0x00000006b6800000| 0%| F| |TAMS 0x00000006b6000000| PB 0x00000006b6000000| Untracked | 0 +|1375|0x00000006b6800000, 0x00000006b6800000, 0x00000006b7000000| 0%| F| |TAMS 0x00000006b6800000| PB 0x00000006b6800000| Untracked | 0 +|1376|0x00000006b7000000, 0x00000006b7000000, 0x00000006b7800000| 0%| F| |TAMS 0x00000006b7000000| PB 0x00000006b7000000| Untracked | 0 +|1377|0x00000006b7800000, 0x00000006b7800000, 0x00000006b8000000| 0%| F| |TAMS 0x00000006b7800000| PB 0x00000006b7800000| Untracked | 0 +|1378|0x00000006b8000000, 0x00000006b8000000, 0x00000006b8800000| 0%| F| |TAMS 0x00000006b8000000| PB 0x00000006b8000000| Untracked | 0 +|1379|0x00000006b8800000, 0x00000006b8800000, 0x00000006b9000000| 0%| F| |TAMS 0x00000006b8800000| PB 0x00000006b8800000| Untracked | 0 +|1380|0x00000006b9000000, 0x00000006b9000000, 0x00000006b9800000| 0%| F| |TAMS 0x00000006b9000000| PB 0x00000006b9000000| Untracked | 0 +|1381|0x00000006b9800000, 0x00000006b9800000, 0x00000006ba000000| 0%| F| |TAMS 0x00000006b9800000| PB 0x00000006b9800000| Untracked | 0 +|1382|0x00000006ba000000, 0x00000006ba000000, 0x00000006ba800000| 0%| F| |TAMS 0x00000006ba000000| PB 0x00000006ba000000| Untracked | 0 +|1383|0x00000006ba800000, 0x00000006ba800000, 0x00000006bb000000| 0%| F| |TAMS 0x00000006ba800000| PB 0x00000006ba800000| Untracked | 0 +|1384|0x00000006bb000000, 0x00000006bb000000, 0x00000006bb800000| 0%| F| |TAMS 0x00000006bb000000| PB 0x00000006bb000000| Untracked | 0 +|1385|0x00000006bb800000, 0x00000006bb800000, 0x00000006bc000000| 0%| F| |TAMS 0x00000006bb800000| PB 0x00000006bb800000| Untracked | 0 +|1386|0x00000006bc000000, 0x00000006bc000000, 0x00000006bc800000| 0%| F| |TAMS 0x00000006bc000000| PB 0x00000006bc000000| Untracked | 0 +|1387|0x00000006bc800000, 0x00000006bc800000, 0x00000006bd000000| 0%| F| |TAMS 0x00000006bc800000| PB 0x00000006bc800000| Untracked | 0 +|1388|0x00000006bd000000, 0x00000006bd000000, 0x00000006bd800000| 0%| F| |TAMS 0x00000006bd000000| PB 0x00000006bd000000| Untracked | 0 +|1389|0x00000006bd800000, 0x00000006bd800000, 0x00000006be000000| 0%| F| |TAMS 0x00000006bd800000| PB 0x00000006bd800000| Untracked | 0 +|1390|0x00000006be000000, 0x00000006be000000, 0x00000006be800000| 0%| F| |TAMS 0x00000006be000000| PB 0x00000006be000000| Untracked | 0 +|1391|0x00000006be800000, 0x00000006be800000, 0x00000006bf000000| 0%| F| |TAMS 0x00000006be800000| PB 0x00000006be800000| Untracked | 0 +|1392|0x00000006bf000000, 0x00000006bf000000, 0x00000006bf800000| 0%| F| |TAMS 0x00000006bf000000| PB 0x00000006bf000000| Untracked | 0 +|1393|0x00000006bf800000, 0x00000006bf800000, 0x00000006c0000000| 0%| F| |TAMS 0x00000006bf800000| PB 0x00000006bf800000| Untracked | 0 +|1394|0x00000006c0000000, 0x00000006c0000000, 0x00000006c0800000| 0%| F| |TAMS 0x00000006c0000000| PB 0x00000006c0000000| Untracked | 0 +|1395|0x00000006c0800000, 0x00000006c0800000, 0x00000006c1000000| 0%| F| |TAMS 0x00000006c0800000| PB 0x00000006c0800000| Untracked | 0 +|1396|0x00000006c1000000, 0x00000006c1000000, 0x00000006c1800000| 0%| F| |TAMS 0x00000006c1000000| PB 0x00000006c1000000| Untracked | 0 +|1397|0x00000006c1800000, 0x00000006c1800000, 0x00000006c2000000| 0%| F| |TAMS 0x00000006c1800000| PB 0x00000006c1800000| Untracked | 0 +|1398|0x00000006c2000000, 0x00000006c2000000, 0x00000006c2800000| 0%| F| |TAMS 0x00000006c2000000| PB 0x00000006c2000000| Untracked | 0 +|1399|0x00000006c2800000, 0x00000006c2800000, 0x00000006c3000000| 0%| F| |TAMS 0x00000006c2800000| PB 0x00000006c2800000| Untracked | 0 +|1400|0x00000006c3000000, 0x00000006c3000000, 0x00000006c3800000| 0%| F| |TAMS 0x00000006c3000000| PB 0x00000006c3000000| Untracked | 0 +|1401|0x00000006c3800000, 0x00000006c3800000, 0x00000006c4000000| 0%| F| |TAMS 0x00000006c3800000| PB 0x00000006c3800000| Untracked | 0 +|1402|0x00000006c4000000, 0x00000006c4000000, 0x00000006c4800000| 0%| F| |TAMS 0x00000006c4000000| PB 0x00000006c4000000| Untracked | 0 +|1403|0x00000006c4800000, 0x00000006c4800000, 0x00000006c5000000| 0%| F| |TAMS 0x00000006c4800000| PB 0x00000006c4800000| Untracked | 0 +|1404|0x00000006c5000000, 0x00000006c5000000, 0x00000006c5800000| 0%| F| |TAMS 0x00000006c5000000| PB 0x00000006c5000000| Untracked | 0 +|1405|0x00000006c5800000, 0x00000006c5800000, 0x00000006c6000000| 0%| F| |TAMS 0x00000006c5800000| PB 0x00000006c5800000| Untracked | 0 +|1406|0x00000006c6000000, 0x00000006c6000000, 0x00000006c6800000| 0%| F| |TAMS 0x00000006c6000000| PB 0x00000006c6000000| Untracked | 0 +|1407|0x00000006c6800000, 0x00000006c6800000, 0x00000006c7000000| 0%| F| |TAMS 0x00000006c6800000| PB 0x00000006c6800000| Untracked | 0 +|1408|0x00000006c7000000, 0x00000006c7000000, 0x00000006c7800000| 0%| F| |TAMS 0x00000006c7000000| PB 0x00000006c7000000| Untracked | 0 +|1409|0x00000006c7800000, 0x00000006c7800000, 0x00000006c8000000| 0%| F| |TAMS 0x00000006c7800000| PB 0x00000006c7800000| Untracked | 0 +|1410|0x00000006c8000000, 0x00000006c8000000, 0x00000006c8800000| 0%| F| |TAMS 0x00000006c8000000| PB 0x00000006c8000000| Untracked | 0 +|1411|0x00000006c8800000, 0x00000006c8800000, 0x00000006c9000000| 0%| F| |TAMS 0x00000006c8800000| PB 0x00000006c8800000| Untracked | 0 +|1412|0x00000006c9000000, 0x00000006c9000000, 0x00000006c9800000| 0%| F| |TAMS 0x00000006c9000000| PB 0x00000006c9000000| Untracked | 0 +|1413|0x00000006c9800000, 0x00000006c9800000, 0x00000006ca000000| 0%| F| |TAMS 0x00000006c9800000| PB 0x00000006c9800000| Untracked | 0 +|1414|0x00000006ca000000, 0x00000006ca000000, 0x00000006ca800000| 0%| F| |TAMS 0x00000006ca000000| PB 0x00000006ca000000| Untracked | 0 +|1415|0x00000006ca800000, 0x00000006ca800000, 0x00000006cb000000| 0%| F| |TAMS 0x00000006ca800000| PB 0x00000006ca800000| Untracked | 0 + +Card table byte_map: [0x000001b9b9340000,0x000001b9bb310000] _byte_map_base: 0x000001b9b7308000 + +Marking Bits: (CMBitMap*) 0x000001b9cb3df9a0 + Bits: [0x000001b9bb310000, 0x000001b9cb150000) + +Polling page: 0x000001b999ce0000 + +Metaspace: + +Usage: + Non-class: 2.67 MB used. + Class: 283.77 KB used. + Both: 2.95 MB used. + +Virtual space: + Non-class space: 64.00 MB reserved, 2.75 MB ( 4%) committed, 1 nodes. + Class space: 1.00 GB reserved, 384.00 KB ( <1%) committed, 1 nodes. + Both: 1.06 GB reserved, 3.12 MB ( <1%) committed. + +Chunk freelists: + Non-Class: 11.83 MB + Class: 15.60 MB + Both: 27.43 MB + +MaxMetaspaceSize: unlimited +CompressedClassSpaceSize: 1.00 GB +Initial GC threshold: 21.00 MB +Current GC threshold: 21.00 MB +CDS: on + - commit_granule_bytes: 65536. + - commit_granule_words: 8192. + - virtual_space_node_default_size: 8388608. + - enlarge_chunks_in_place: 1. + - use_allocation_guard: 0. + + +Internal statistics: + +num_allocs_failed_limit: 0. +num_arena_births: 36. +num_arena_deaths: 0. +num_vsnodes_births: 2. +num_vsnodes_deaths: 0. +num_space_committed: 50. +num_space_uncommitted: 0. +num_chunks_returned_to_freelist: 0. +num_chunks_taken_from_freelist: 51. +num_chunk_merges: 0. +num_chunk_splits: 33. +num_chunks_enlarged: 20. +num_inconsistent_stats: 0. + +CodeHeap 'non-profiled nmethods': size=117248Kb used=559Kb max_used=559Kb free=116688Kb + bounds [0x000001b9addc0000, 0x000001b9ae030000, 0x000001b9b5040000] +CodeHeap 'profiled nmethods': size=117184Kb used=943Kb max_used=943Kb free=116240Kb + bounds [0x000001b9a6040000, 0x000001b9a62b0000, 0x000001b9ad2b0000] +CodeHeap 'non-nmethods': size=11328Kb used=1427Kb max_used=3160Kb free=9900Kb + bounds [0x000001b9ad2b0000, 0x000001b9ad5d0000, 0x000001b9addc0000] +CodeCache: size=245760Kb, used=2929Kb, max_used=4662Kb, free=242828Kb + total_blobs=1285, nmethods=821, adapters=376, full_count=0 +Compilation: enabled, stopped_count=0, restarted_count=0 + +JVMCI Events (20 events): +Event: 17.806 Thread 0x000001ba112526c0 done waiting for JavaVM references initialization in JVMCI runtime 2 +Event: 17.806 Thread 0x000001ba112526c0 initialized JVMCI runtime 2 +Event: 18.871 Thread 0x000001ba160bc010 detaching from JVMCI runtime 1: releasing idle compiler thread (0 other threads still attached) +Event: 18.871 Thread 0x000001ba160bc010 shutting down HotSpotJVMCIRuntime for JVMCI runtime 1 +Event: 18.871 Thread 0x000001ba160bc010 shut down JVMCI runtime 1 +Event: 18.874 Thread 0x000001ba160bc010 destroyed JavaVM[13]@0x000001ca17a1bd38 for JVMCI runtime 1 +Event: 18.874 Thread 0x000001ba160bc010 releasing handles for JVMCI runtime 1: oop handles=98, metadata handles={total=155, live=146, blocks=6} +Event: 18.874 Thread 0x000001ba160bc010 detached from JVMCI runtime 1 +Event: 18.887 Thread 0x000001ba112526c0 detaching from JVMCI runtime 2: releasing idle compiler thread (0 other threads still attached) +Event: 18.887 Thread 0x000001ba112526c0 shutting down HotSpotJVMCIRuntime for JVMCI runtime 2 +Event: 18.888 Thread 0x000001ba112526c0 shut down JVMCI runtime 2 +Event: 18.892 Thread 0x000001ba112526c0 destroyed JavaVM[14]@0x000001c217a1bd38 for JVMCI runtime 2 +Event: 18.892 Thread 0x000001ba112526c0 releasing handles for JVMCI runtime 2: oop handles=71, metadata handles={total=128, live=120, blocks=8} +Event: 18.892 Thread 0x000001ba112526c0 detached from JVMCI runtime 2 +Event: 19.189 Thread 0x000001ba11105a80 detaching from JVMCI runtime 3: releasing idle compiler thread (0 other threads still attached) +Event: 19.189 Thread 0x000001ba11105a80 shutting down HotSpotJVMCIRuntime for JVMCI runtime 3 +Event: 19.189 Thread 0x000001ba11105a80 shut down JVMCI runtime 3 +Event: 19.197 Thread 0x000001ba11105a80 destroyed JavaVM[12]@0x000001ba17a1bd38 for JVMCI runtime 3 +Event: 19.197 Thread 0x000001ba11105a80 releasing handles for JVMCI runtime 3: oop handles=57, metadata handles={total=224, live=211, blocks=7} +Event: 19.197 Thread 0x000001ba11105a80 detached from JVMCI runtime 3 + +Compilation events (20 events): +Event: 17.769 Thread 0x000001ba11106660 nmethod 816% 0x000001b9a612a688 code [0x000001b9a612a7e0, 0x000001b9a612ab18] +Event: 17.769 Thread 0x000001ba11106660 811 3 java.util.concurrent.ThreadLocalRandom::getProbe (13 bytes) +Event: 17.769 Thread 0x000001ba11106660 nmethod 811 0x000001b9a612ab88 code [0x000001b9a612aca0, 0x000001b9a612adb0] +Event: 17.771 Thread 0x000001ba11106660 817 3 org.kne.cloud.network.monitor.TimestampMonitor::recordPacket (119 bytes) +Event: 17.771 Thread 0x000001ba11106660 nmethod 817 0x000001b9a612ae88 code [0x000001b9a612b0a0, 0x000001b9a612bbc0] +Event: 17.797 Thread 0x000001ba11105a80 nmethod 812 0x000001b9ade37888 code [0x000001b9ade37980, 0x000001b9ade37b90] +Event: 17.797 Thread 0x000001ba11105a80 820 ! 4 java.util.concurrent.ConcurrentHashMap::putVal (432 bytes) +Event: 17.797 Thread 0x000001ba112526c0 818 4 java.util.concurrent.ConcurrentHashMap::addCount (280 bytes) +Event: 17.797 Thread 0x000001ba160bc010 819 4 org.kne.cloud.network.monitor.TimestampMonitor::recordPacket (119 bytes) +Event: 17.838 Thread 0x000001ba11105a80 nmethod 820 0x000001b9ade37c08 code [0x000001b9ade37da0, 0x000001b9ade38e40] +Event: 17.838 Thread 0x000001ba11105a80 813 4 java.util.concurrent.ConcurrentHashMap::spread (10 bytes) +Event: 17.840 Thread 0x000001ba11105a80 nmethod 813 0x000001b9ade38f08 code [0x000001b9ade39000, 0x000001b9ade39070] +Event: 17.840 Thread 0x000001ba11105a80 814 4 org.kne.cloud.network.monitor.TimestampMonitor$TimestampMonitorKey::hashCode (25 bytes) +Event: 17.842 Thread 0x000001ba11105a80 nmethod 814 0x000001b9ade39208 code [0x000001b9ade39300, 0x000001b9ade39420] +Event: 17.842 Thread 0x000001ba11105a80 821 % 4 org.kne.cloud.network.monitor.TimestampMonitor::lambda$8 @ 0 (18 bytes) +Event: 17.867 Thread 0x000001ba160bc010 nmethod 819 0x000001b9ade39508 code [0x000001b9ade39740, 0x000001b9ade3b290] +Event: 17.868 Thread 0x000001ba160bc010 815 4 java.lang.Long::hashCode (8 bytes) +Event: 17.870 Thread 0x000001ba160bc010 nmethod 815 0x000001b9ade3b408 code [0x000001b9ade3b500, 0x000001b9ade3b590] +Event: 17.888 Thread 0x000001ba112526c0 nmethod 818 0x000001b9ade3b708 code [0x000001b9ade3b900, 0x000001b9ade3dad8] +Event: 18.183 Thread 0x000001ba11105a80 nmethod 821% 0x000001b9ade3dc08 code [0x000001b9ade3e9e0, 0x000001b9ade4baf8] + +GC Heap History (20 events): +Event: 7.310 GC heap after +{Heap after GC invocations=12 (full 0): + garbage-first heap total reserved 16662528K, committed 6340608K, used 1094795K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 5 young (40960K), 5 survivors (40960K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 9.227 GC heap before +{Heap before GC invocations=12 (full 0): + garbage-first heap total reserved 16662528K, committed 6340608K, used 1438859K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 38 young (311296K), 5 survivors (40960K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 9.478 GC heap after +{Heap after GC invocations=13 (full 0): + garbage-first heap total reserved 16662528K, committed 9633792K, used 1359872K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 5 young (40960K), 5 survivors (40960K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 10.494 GC heap before +{Heap before GC invocations=13 (full 0): + garbage-first heap total reserved 16662528K, committed 9633792K, used 1794048K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 58 young (475136K), 5 survivors (40960K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 10.829 GC heap after +{Heap after GC invocations=14 (full 0): + garbage-first heap total reserved 16662528K, committed 9633792K, used 1653724K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 8 young (65536K), 8 survivors (65536K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 11.413 GC heap before +{Heap before GC invocations=14 (full 0): + garbage-first heap total reserved 16662528K, committed 9633792K, used 2063324K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 58 young (475136K), 8 survivors (65536K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 11.717 GC heap after +{Heap after GC invocations=15 (full 0): + garbage-first heap total reserved 16662528K, committed 9633792K, used 1932225K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 8 young (65536K), 8 survivors (65536K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 12.260 GC heap before +{Heap before GC invocations=15 (full 0): + garbage-first heap total reserved 16662528K, committed 9633792K, used 2341825K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 58 young (475136K), 8 survivors (65536K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 12.501 GC heap after +{Heap after GC invocations=16 (full 0): + garbage-first heap total reserved 16662528K, committed 9633792K, used 2211407K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 8 young (65536K), 8 survivors (65536K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 16.862 GC heap before +{Heap before GC invocations=16 (full 0): + garbage-first heap total reserved 16662528K, committed 9633792K, used 2760271K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 58 young (475136K), 8 survivors (65536K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 17.160 GC heap after +{Heap after GC invocations=17 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 2652625K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 8 young (65536K), 8 survivors (65536K) + Metaspace used 3018K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 18.284 GC heap before +{Heap before GC invocations=17 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 3160529K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 70 young (573440K), 8 survivors (65536K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 18.575 GC heap after +{Heap after GC invocations=18 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 2998272K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 9 survivors (73728K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 19.499 GC heap before +{Heap before GC invocations=18 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 3497984K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 70 young (573440K), 9 survivors (73728K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 19.812 GC heap after +{Heap after GC invocations=19 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 3340337K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 9 survivors (73728K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 20.618 GC heap before +{Heap before GC invocations=19 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 3840049K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 70 young (573440K), 9 survivors (73728K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 20.887 GC heap after +{Heap after GC invocations=20 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 3678208K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 9 survivors (73728K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 21.550 GC heap before +{Heap before GC invocations=20 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 4177920K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 70 young (573440K), 9 survivors (73728K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 21.760 GC heap after +{Heap after GC invocations=21 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 4012216K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 9 young (73728K), 9 survivors (73728K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} +Event: 22.342 GC heap before +{Heap before GC invocations=21 (full 0): + garbage-first heap total reserved 16662528K, committed 11599872K, used 4511928K [0x0000000407000000, 0x0000000800000000) + region size 8192K, 70 young (573440K), 9 survivors (73728K) + Metaspace used 3019K, committed 3200K, reserved 1114112K + class space used 283K, committed 384K, reserved 1048576K +} + +Dll operation events (9 events): +Event: 0.010 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\java.dll +Event: 0.098 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jsvml.dll +Event: 0.100 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jvmcicompiler.dll +Event: 0.216 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\zip.dll +Event: 0.220 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\instrument.dll +Event: 0.225 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\net.dll +Event: 0.226 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\nio.dll +Event: 0.232 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\zip.dll +Event: 0.695 Loaded shared library C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jimage.dll + +Deoptimization events (20 events): +Event: 6.004 Thread 0x000001ba1197c280 DEOPT PACKING pc=0x000001b9a612726f sp=0x000000b5e09ff630 +Event: 6.004 Thread 0x000001ba1197c280 DEOPT UNPACKING pc=0x000001b9ad3049a3 sp=0x000000b5e09feb28 mode 0 +Event: 17.764 Thread 0x000001ba1197c280 Uncommon trap: trap_request=0xffffffed fr.pc=0x000001b9ade35d34 relative=0x0000000000008cf4 +Event: 17.764 Thread 0x000001ba1197c280 Uncommon trap: reason=null_assert_or_unreached0 action=reinterpret pc=0x000001b9ade35d34 method=java.util.concurrent.ConcurrentHashMap.addCount(JI)V @ 4 jvmci +Event: 17.764 Thread 0x000001ba1197c280 DEOPT PACKING pc=0x000001b9ade35d34 sp=0x000000b5e09ff370 +Event: 17.764 Thread 0x000001ba1197c280 DEOPT UNPACKING pc=0x000001b9ad3049a3 sp=0x000000b5e09fe7f8 mode 3 +Event: 17.764 Thread 0x000001ba1197c280 Uncommon trap: trap_request=0xffffffed fr.pc=0x000001b9addecc85 relative=0x0000000000000e45 +Event: 17.764 Thread 0x000001ba1197c280 Uncommon trap: reason=null_assert_or_unreached0 action=reinterpret pc=0x000001b9addecc85 method=java.util.concurrent.ConcurrentHashMap.addCount(JI)V @ 4 jvmci +Event: 17.764 Thread 0x000001ba1197c280 DEOPT PACKING pc=0x000001b9addecc85 sp=0x000000b5e09ff510 +Event: 17.764 Thread 0x000001ba1197c280 DEOPT UNPACKING pc=0x000001b9ad3049a3 sp=0x000000b5e09fe8e0 mode 3 +Event: 17.764 Thread 0x000001ba1197c280 Uncommon trap: trap_request=0xffffffed fr.pc=0x000001b9addee9fa relative=0x00000000000012da +Event: 17.764 Thread 0x000001ba1197c280 Uncommon trap: reason=null_assert_or_unreached0 action=reinterpret pc=0x000001b9addee9fa method=java.util.concurrent.ConcurrentHashMap.addCount(JI)V @ 4 jvmci +Event: 17.764 Thread 0x000001ba1197c280 DEOPT PACKING pc=0x000001b9addee9fa sp=0x000000b5e09ff3e0 +Event: 17.764 Thread 0x000001ba1197c280 DEOPT UNPACKING pc=0x000001b9ad3049a3 sp=0x000000b5e09fe8e0 mode 3 +Event: 17.770 Thread 0x000001ba1197c280 Uncommon trap: trap_request=0xffffffed fr.pc=0x000001b9addfb072 relative=0x0000000000001732 +Event: 17.770 Thread 0x000001ba1197c280 Uncommon trap: reason=null_assert_or_unreached0 action=reinterpret pc=0x000001b9addfb072 method=java.util.concurrent.ConcurrentHashMap.addCount(JI)V @ 4 jvmci +Event: 17.770 Thread 0x000001ba1197c280 DEOPT PACKING pc=0x000001b9addfb072 sp=0x000000b5e09ff540 +Event: 17.770 Thread 0x000001ba1197c280 DEOPT UNPACKING pc=0x000001b9ad3049a3 sp=0x000000b5e09fe830 mode 3 +Event: 18.185 Thread 0x000001ba1197c280 DEOPT PACKING pc=0x000001b9a612aa6f sp=0x000000b5e09ff630 +Event: 18.185 Thread 0x000001ba1197c280 DEOPT UNPACKING pc=0x000001b9ad3049a3 sp=0x000000b5e09feb28 mode 0 + +Classes loaded (20 events): +Event: 4.768 Loading class java/util/stream/ReferencePipeline$5 +Event: 4.768 Loading class java/util/stream/LongPipeline$StatelessOp +Event: 4.768 Loading class java/util/stream/LongPipeline +Event: 4.768 Loading class java/util/stream/LongStream +Event: 4.768 Loading class java/util/stream/LongStream done +Event: 4.769 Loading class java/util/stream/LongPipeline done +Event: 4.769 Loading class java/util/stream/LongPipeline$StatelessOp done +Event: 4.769 Loading class java/util/stream/ReferencePipeline$5 done +Event: 4.770 Loading class java/util/function/LongBinaryOperator +Event: 4.770 Loading class java/util/function/LongBinaryOperator done +Event: 4.780 Loading class java/util/stream/ReduceOps$10 +Event: 4.780 Loading class java/util/stream/ReduceOps$10 done +Event: 4.792 Loading class java/util/stream/ReduceOps$8ReducingSink +Event: 4.792 Loading class java/util/stream/Sink$OfLong +Event: 4.792 Loading class java/util/stream/Sink$OfLong done +Event: 4.792 Loading class java/util/stream/ReduceOps$8ReducingSink done +Event: 4.792 Loading class java/util/stream/ReferencePipeline$5$1 +Event: 4.792 Loading class java/util/stream/ReferencePipeline$5$1 done +Event: 4.792 Loading class java/util/concurrent/ConcurrentHashMap$TableStack +Event: 4.792 Loading class java/util/concurrent/ConcurrentHashMap$TableStack done + +Classes unloaded (0 events): +No events + +Classes redefined (0 events): +No events + +Internal exceptions (6 events): +Event: 0.486 Thread 0x000001b99bf22130 Exception (0x0000000446fa9ed8) +thrown [s\open\src\hotspot\share\interpreter\linkResolver.cpp, line 796] +Event: 0.538 Thread 0x000001b99bf22130 Exception (0x0000000446fbd270) +thrown [s\open\src\hotspot\share\interpreter\linkResolver.cpp, line 796] +Event: 0.673 Thread 0x000001b99bf22130 Exception (0x00000004461931f8) +thrown [s\open\src\hotspot\share\interpreter\linkResolver.cpp, line 796] +Event: 0.845 Thread 0x000001b99bf22130 Exception (0x0000000446276f68) +thrown [s\open\src\hotspot\share\interpreter\linkResolver.cpp, line 796] +Event: 4.408 Thread 0x000001b99bf22130 Exception (0x0000000589a65d00) +thrown [s\open\src\hotspot\share\interpreter\linkResolver.cpp, line 796] +Event: 4.697 Thread 0x000001b99bf22130 Exception (0x00000005886bdd70) +thrown [s\open\src\hotspot\share\interpreter\linkResolver.cpp, line 796] + +VM Operations (20 events): +Event: 16.787 Executing VM operation: ChangeSingleStep done +Event: 16.788 Executing VM operation: ChangeSingleStep +Event: 16.788 Executing VM operation: ChangeSingleStep done +Event: 16.862 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 17.161 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 17.751 Executing VM operation: ChangeSingleStep +Event: 17.751 Executing VM operation: ChangeSingleStep done +Event: 17.760 Executing VM operation: ChangeSingleStep +Event: 17.761 Executing VM operation: ChangeSingleStep done +Event: 17.762 Executing VM operation: get/set locals +Event: 17.762 Executing VM operation: get/set locals done +Event: 18.284 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 18.575 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 19.499 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 19.812 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 20.618 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 20.887 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 21.550 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) +Event: 21.760 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) done +Event: 22.342 Executing VM operation: G1CollectForAllocation (G1 Evacuation Pause) + +Memory protections (0 events): +No events + +Nmethod flushes (0 events): +No events + +Events (20 events): +Event: 4.807 Thread 0x000001ba16035350 Thread added: 0x000001ba1605a7e0 +Event: 4.852 Thread 0x000001ba160387d0 Thread added: 0x000001ba1605ae70 +Event: 4.853 Thread 0x000001ba160359e0 Thread added: 0x000001ba1609f9b0 +Event: 4.853 Thread 0x000001ba112526c0 Thread added: 0x000001ba16051d90 +Event: 4.877 Thread 0x000001ba16051d90 Thread added: 0x000001ba160a8bd0 +Event: 4.879 Thread 0x000001ba16051d90 Thread added: 0x000001ba160a9ab0 +Event: 4.880 Thread 0x000001ba16051d90 Thread added: 0x000001ba160ac180 +Event: 5.092 Thread 0x000001ba160ac180 Thread exited: 0x000001ba160ac180 +Event: 5.117 Thread 0x000001ba160a9ab0 Thread exited: 0x000001ba160a9ab0 +Event: 5.254 Thread 0x000001ba16051d90 Thread added: 0x000001ba160bc010 +Event: 5.421 Thread 0x000001ba11105a80 Thread added: 0x000001ba11bec360 +Event: 5.422 Thread 0x000001ba11105a80 Thread added: 0x000001ba11beca20 +Event: 10.829 Thread 0x000001ba160bc010 Thread exited: 0x000001ba160bc010 +Event: 11.717 Thread 0x000001ba11bec360 Thread exited: 0x000001ba11bec360 +Event: 11.717 Thread 0x000001ba11beca20 Thread exited: 0x000001ba11beca20 +Event: 12.014 Thread 0x000001ba160a8bd0 Thread exited: 0x000001ba160a8bd0 +Event: 15.829 Thread 0x000001ba16051d90 Thread exited: 0x000001ba16051d90 +Event: 17.765 Thread 0x000001ba112526c0 Thread exited: 0x000001ba112526c0 +Event: 17.797 Thread 0x000001ba11105a80 Thread added: 0x000001ba112526c0 +Event: 17.797 Thread 0x000001ba11105a80 Thread added: 0x000001ba160bc010 + + +Dynamic libraries: +0x00007ff63b640000 - 0x00007ff63b650000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\javaw.exe +0x00007fff302e0000 - 0x00007fff304e1000 C:\Windows\SYSTEM32\ntdll.dll +0x00007fff2ef90000 - 0x00007fff2f04e000 C:\Windows\System32\KERNEL32.DLL +0x00007fff2d9a0000 - 0x00007fff2dd0e000 C:\Windows\System32\KERNELBASE.dll +0x00007fff2df20000 - 0x00007fff2e030000 C:\Windows\System32\ucrtbase.dll +0x00007fff28080000 - 0x00007fff28097000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jli.dll +0x00007fff28040000 - 0x00007fff2805b000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\VCRUNTIME140.dll +0x00007fff2e9c0000 - 0x00007fff2eb65000 C:\Windows\System32\USER32.dll +0x00007fff13dd0000 - 0x00007fff14075000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.20348.1_none_88d3d41d702dedea\COMCTL32.dll +0x00007fff2ddd0000 - 0x00007fff2ddf6000 C:\Windows\System32\win32u.dll +0x00007fff2e3e0000 - 0x00007fff2e40b000 C:\Windows\System32\GDI32.dll +0x00007fff2f460000 - 0x00007fff2f503000 C:\Windows\System32\msvcrt.dll +0x00007fff2de00000 - 0x00007fff2df1a000 C:\Windows\System32\gdi32full.dll +0x00007fff2d900000 - 0x00007fff2d9a0000 C:\Windows\System32\msvcp_win.dll +0x00007fff2fe80000 - 0x00007fff2feb1000 C:\Windows\System32\IMM32.DLL +0x00007fff1a850000 - 0x00007fff1a85c000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\vcruntime140_1.dll +0x00007ffefd890000 - 0x00007ffefd91e000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\msvcp140.dll +0x00007ffdac1c0000 - 0x00007ffdacf0f000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\server\jvm.dll +0x00007fff2f3b0000 - 0x00007fff2f45e000 C:\Windows\System32\ADVAPI32.dll +0x00007fff2e920000 - 0x00007fff2e9bf000 C:\Windows\System32\sechost.dll +0x00007fff2fd50000 - 0x00007fff2fe6f000 C:\Windows\System32\RPCRT4.dll +0x00007fff2f0f0000 - 0x00007fff2f161000 C:\Windows\System32\WS2_32.dll +0x00007fff2d770000 - 0x00007fff2d7bd000 C:\Windows\SYSTEM32\POWRPROF.dll +0x00007fff293d0000 - 0x00007fff293da000 C:\Windows\SYSTEM32\VERSION.dll +0x00007fff26410000 - 0x00007fff26437000 C:\Windows\SYSTEM32\WINMM.dll +0x00007fff2d750000 - 0x00007fff2d763000 C:\Windows\SYSTEM32\UMPDC.dll +0x00007fff2c1f0000 - 0x00007fff2c207000 C:\Windows\SYSTEM32\kernel.appcore.dll +0x00007fff19fd0000 - 0x00007fff19fda000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jimage.dll +0x00007fff179e0000 - 0x00007fff17bf2000 C:\Windows\SYSTEM32\DBGHELP.DLL +0x00007fff16980000 - 0x00007fff169b0000 C:\Windows\SYSTEM32\dbgcore.DLL +0x00007fff2e030000 - 0x00007fff2e0ad000 C:\Windows\System32\bcryptPrimitives.dll +0x00007ffef4bb0000 - 0x00007ffef4bec000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jdwp.dll +0x00007fff0f250000 - 0x00007fff0f25f000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\instrument.dll +0x00007fff16340000 - 0x00007fff1635e000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\java.dll +0x00007fff2f170000 - 0x00007fff2f2a5000 C:\Windows\System32\ole32.dll +0x00007fff2ff20000 - 0x00007fff30291000 C:\Windows\System32\combase.dll +0x00007fff2f570000 - 0x00007fff2fcca000 C:\Windows\System32\SHELL32.dll +0x00007fff23550000 - 0x00007fff23d96000 C:\Windows\SYSTEM32\windows.storage.dll +0x00007fff2eea0000 - 0x00007fff2ef8a000 C:\Windows\System32\SHCORE.dll +0x00007fff2fcf0000 - 0x00007fff2fd4f000 C:\Windows\System32\shlwapi.dll +0x00007fff2d7c0000 - 0x00007fff2d7e1000 C:\Windows\SYSTEM32\profapi.dll +0x00007ffee94d0000 - 0x00007ffee95a7000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jsvml.dll +0x00007ffd377e0000 - 0x00007ffd3a408000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\jvmcicompiler.dll +0x00007fff2f0e0000 - 0x00007fff2f0e8000 C:\Windows\System32\PSAPI.DLL +0x00007fff2e0b0000 - 0x00007fff2e210000 C:\Windows\System32\CRYPT32.dll +0x00007fff2ce60000 - 0x00007fff2ce8e000 C:\Windows\SYSTEM32\USERENV.dll +0x00007fff2d0d0000 - 0x00007fff2d0fe000 C:\Windows\SYSTEM32\ncrypt.dll +0x00007fff2caa0000 - 0x00007fff2cacd000 C:\Windows\SYSTEM32\IPHLPAPI.DLL +0x00007fff2cd60000 - 0x00007fff2cdc8000 C:\Windows\SYSTEM32\MSWSOCK.dll +0x00007fff2d090000 - 0x00007fff2d0c7000 C:\Windows\SYSTEM32\NTASN1.dll +0x00007fff0f240000 - 0x00007fff0f24c000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\dt_socket.dll +0x00007fff2cad0000 - 0x00007fff2cbae000 C:\Windows\SYSTEM32\DNSAPI.dll +0x00007fff2e210000 - 0x00007fff2e219000 C:\Windows\System32\NSI.dll +0x00007fff262e0000 - 0x00007fff262ea000 C:\Windows\System32\rasadhlp.dll +0x00007fff26c90000 - 0x00007fff26d12000 C:\Windows\System32\fwpuclnt.dll +0x00007fff0fc50000 - 0x00007fff0fc67000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\zip.dll +0x00007fff19fc0000 - 0x00007fff19fd0000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\net.dll +0x00007fff16320000 - 0x00007fff16336000 C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\nio.dll + +dbghelp: loaded successfully - version: 4.0.5 - missing functions: none +symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin;C:\Windows\SYSTEM32;C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.20348.1_none_88d3d41d702dedea;C:\Program Files\Java\graalvm-jdk-23.0.1+11.1\bin\server + +VM Arguments: +jvm_args: -XX:ThreadPriorityPolicy=1 -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCIProduct -XX:-UnlockExperimentalVMOptions --add-exports=java.base/jdk.internal.misc=jdk.graal.compiler -XX:+ShowCodeDetailsInExceptionMessages -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:41761 -javaagent:C:\Program Files\eclipse\configuration\org.eclipse.osgi\837\0\.cp\lib\javaagent-shaded.jar --add-exports=java.base/jdk.internal.misc=ALL-UNNAMED --add-exports=java.base/jdk.internal.foreign=ALL-UNNAMED --add-opens=java.base/jdk.internal.misc=ALL-UNNAMED --add-opens=java.base/jdk.internal.foreign=ALL-UNNAMED +java_command: org.kne.cloud.network.monitor.TimestampMonitor +java_class_path (initial): C:\KNEļ\coding\java\KLALB\bin;C:\KNEļ\coding\java\KNElib\bin;C:\KNEļ\coding\java\KLALB\lib\gson-2.1.jar;C:\KNEļ\coding\java\KLALB\lib\javassist.jar;C:\KNEļ\coding\java\KLALB\lib\ini4j.jar;C:\KNEļ\coding\java\KLALB\lib\JFreeChart1.5.2.jar;C:\KNEļ\coding\java\KLALB\lib\toml4j-0.7.1.jar;C:\KNEļ\coding\java\KLALB\lib\pcap4j-core-1.8.2.jar;C:\KNEļ\coding\java\KLALB\lib\pcap4j-packetfactory-propertiesbased-1.8.2.jar;C:\KNEļ\coding\java\KLALB\lib\pcap4j-packetfactory-static-1.8.2.jar;C:\KNEļ\coding\java\KLALB\lib\pcap4j-sample-1.8.2.jar;C:\KNEļ\coding\java\KLALB\lib\slf4j-api-2.0.9.jar;C:\KNEļ\coding\java\KLALB\lib\slf4j-api-2.0.9-javadoc.jar;C:\KNEļ\coding\java\KLALB\lib\slf4j-api-2.0.9-sources.jar;C:\KNEļ\coding\java\KLALB\lib\slf4j-api-2.0.9-tests.jar;C:\KNEļ\coding\java\KLALB\lib\disruptor-4.0.0.jar;C:\KNEļ\coding\java\KLALB\lib\disruptor-4.0.0-javadoc.jar;C:\KNEļ\coding\java\KLALB\lib\disruptor-4.0.0-sources.jar;C:\KNEļ\coding\java\KLALB\lib\JavaTUN.jar +Launcher Type: SUN_STANDARD + +[Global flags] + intx CICompilerCount = 15 {product} {ergonomic} + uint ConcGCThreads = 10 {product} {ergonomic} + bool EnableJVMCIProduct = true {JVMCI product} {jimage} + uint G1ConcRefinementThreads = 38 {product} {ergonomic} + size_t G1HeapRegionSize = 8388608 {product} {ergonomic} + size_t InitialHeapSize = 1073741824 {product} {ergonomic} + size_t MarkStackSize = 4194304 {product} {ergonomic} + size_t MarkStackSizeMax = 536870912 {product} {ergonomic} + size_t MaxHeapSize = 17062428672 {product} {ergonomic} + size_t MaxNewSize = 10234101760 {product} {ergonomic} + size_t MinHeapDeltaBytes = 8388608 {product} {ergonomic} + size_t MinHeapSize = 8388608 {product} {ergonomic} + uintx NonNMethodCodeHeapSize = 11599872 {pd product} {ergonomic} + uintx NonProfiledCodeHeapSize = 120061952 {pd product} {ergonomic} + uintx ProfiledCodeHeapSize = 119996416 {pd product} {ergonomic} + uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic} + bool SegmentedCodeCache = true {product} {ergonomic} + bool ShowCodeDetailsInExceptionMessages = true {manageable} {command line} + size_t SoftMaxHeapSize = 17062428672 {manageable} {ergonomic} + int ThreadPriorityPolicy = 1 {product} {jimage} + bool UseCompressedOops = true {product lp64_product} {ergonomic} + bool UseG1GC = true {product} {ergonomic} + bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic} + +Logging: +Log output configuration: + #0: stdout all=warning uptime,level,tags foldmultilines=false + #1: stderr all=off uptime,level,tags foldmultilines=false + +Environment Variables: +JAVA_HOME=C:\Program Files\Java\jdk-19 +PATH=C:/Program Files/Java/graalvm-ce-java19-22.3.1/bin/server;C:/Program Files/Java/graalvm-ce-java19-22.3.1/bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1\libnvvp;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\libnvvp;C:\Program Files (x86)\VMware\VMware Workstation\bin\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Java\jdk-19\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\Bandizip\;C:\Program Files\Docker\Docker\resources\bin;C:\ProgramData\chocolatey\bin;C:\tools\Manim\Scripts;C:\Program Files\MiKTeX\miktex\bin\x64\;C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Program Files\dotnet\;C:\Program Files (x86)\NetSarang\Xftp 7\;C:\Program Files\010 Editor;C:\Program Files\nodejs\;C:\Program Files\Microsoft VS Code Insiders\bin;C:\Program Files\Disktrix\UltimateDefrag;C:\Program Files\Sunshine;C:\Program Files\Sunshine\tools;C:\Program Files\NVIDIA Corporation\Nsight Compute 2023.1.0\;C:\Users\Administrator\AppData\Local\Programs\Python\Python310\Scripts\;C:\Users\Administrator\AppData\Local\Programs\Python\Python310\;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\Users\Administrator\AppData\Roaming\npm;C:\Program Files\eclipse; +USERNAME=Administrator +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 85 Stepping 4, GenuineIntel +TMP=C:\Users\ADMINI~1\AppData\Local\Temp +TEMP=C:\Users\ADMINI~1\AppData\Local\Temp + + + + +Periodic native trim disabled + +--------------- S Y S T E M --------------- + +OS: + Windows Server 2022 , 64 bit Build 20348 (10.0.20348.1726) +OS uptime: 20 days 23:58 hours + +CPU: total 56 (initial active 56) (14 cores per cpu, 2 threads per core) family 6 model 85 stepping 4 microcode 0x2006b06, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, rtm, adx, fma, vzeroupper, clflush, clflushopt, clwb, rdtscp, f16c, pku +Processor Information for the first 56 processors : + Max Mhz: 2195, Current Mhz: 2195, Mhz Limit: 2195 + +Memory: 4k page, system-wide physical 65072M (9754M free) +TotalPageFile size 97840M (AvailPageFile size 448M) +current process WorkingSet (physical memory assigned to process): 5394M, peak: 5394M +current process commit charge ("private bytes"): 11760M, peak: 13040M + +vm_info: Java HotSpot(TM) 64-Bit Server VM (23.0.1+11-jvmci-b01) for windows-amd64 JRE (23.0.1+11-jvmci-b01), built on 2024-10-01T10:34:46Z with MS VC++ 17.6 (VS2022) + +END. diff --git a/hs_err_pid29580.mdmp b/hs_err_pid29580.mdmp new file mode 100644 index 0000000..e69de29 diff --git a/klalb-config.json b/klalb-config.json index e1d69a5..a67b291 100644 --- a/klalb-config.json +++ b/klalb-config.json @@ -1 +1,102 @@ -[{"language":"ZH_CN","nogui":false,"VirtualAddress":"2486:1:0:0:0:0:0:8888","DNS":["2486:1:0:0:0:0:0:8888"],"TCPListen":"0.0.0.0:4565","UDPListen":"{UDP}0.0.0.0:4572","VirtualSocketName":"KLALB_Stream","LineTable":["07f4acdef99b.ofalias.net:4565"],"ConnectLineTable":[],"Type":"KLALBController"},{"Listen":"0.0.0.0:4572","Bridge":{"KLALB":"SocketBridge","RDP":"SocketBridge","HTTP":"SocketBridge","HTTPS":"SocketBridge","DEFAULT":"MinecraftSocketBridge23332"},"Connect":{"KLALB":"127.0.0.1:4565","RDP":"127.0.0.1:3389","HTTP":"127.0.0.1:5212","HTTPS":"192.168.1.235:443","DEFAULT":"127.0.0.1:36555"},"Type":"SocketBridge"},{"Listen":"{KLALB_Stream}[::0]:23332","Bridge":{"DEFAULT":"MinecraftSocketBridge23332"},"Connect":{"DEFAULT":"127.0.0.1:36555"},"Type":"SocketBridge"},{"Listen":"{KLALB_Stream}[::0]:23333","Bridge":{"DEFAULT":"SocketBridge"},"Connect":{"DEFAULT":"127.0.0.1:5212"},"Type":"SocketBridge"},{"Listen":"0.0.0.0:25561","Bridge":{"KLALB":"SocketBridge","DEFAULT":"MinecraftSocketBridge23330"},"Connect":{"KLALB":"127.0.0.1:4565","DEFAULT":"127.0.0.1:25562"},"Type":"SocketBridge"},{"Listen":"{KLALB_Stream}[::0]:23330","Bridge":{"DEFAULT":"MinecraftSocketBridge23330"},"Connect":{"DEFAULT":"127.0.0.1:25562"},"Type":"SocketBridge"}] \ No newline at end of file +[ + { + "language": "ZH_CN", + "nogui": false, + "VirtualAddress": "2486:1:0:0:0:0:0:8888", + "VirtualASN": 2142606939373348329, + "DNS": [ + "2486:1:0:0:0:0:0:8888" + ], + "TCPListen": "0.0.0.0:4565", + "UDPListen": "{UDP}0.0.0.0:4572", + "VirtualSocketName": "KLALB_Stream", + "LineTable": [ + "07f4acdef99b.ofalias.net:4565" + ], + "ConnectLineTable": [ + "home-ipv6.sliveridc1.cn:4565", + "home-ltipv6.sliveridc1.cn:4565" + ], + "ntpServerTable": [ + "{UDP}ntp1.aliyun.com:123", + "{UDP}ntp2.aliyun.com:123", + "{UDP}ntp3.aliyun.com:123", + "{UDP}ntp4.aliyun.com:123", + "{UDP}ntp5.aliyun.com:123", + "{UDP}ntp6.aliyun.com:123", + "{UDP}ntp7.aliyun.com:123", + "{UDP}ntp1.tencent.com:123", + "{UDP}ntp2.tencent.com:123", + "{UDP}ntp3.tencent.com:123", + "{UDP}ntp4.tencent.com:123", + "{UDP}ntp5.tencent.com:123", + "{UDP}time.google.com:123", + "{UDP}time.apple.com:123", + "{UDP}pool.ntp.org:123", + "{UDP}ntp.ntsc.ac.cn:123", + "{UDP}us.ntp.org.cn:123" + ], + "NetworkInterfaceExcepts": [], + "Type": "KLALBController" + }, + { + "Listen": "0.0.0.0:4572", + "Bridge": { + "KLALB": "SocketBridge", + "RDP": "SocketBridge", + "HTTP": "SocketBridge", + "HTTPS": "SocketBridge", + "DEFAULT": "MinecraftSocketBridge23332" + }, + "Connect": { + "KLALB": "127.0.0.1:4565", + "RDP": "127.0.0.1:3389", + "HTTP": "127.0.0.1:5212", + "HTTPS": "192.168.1.235:443", + "DEFAULT": "127.0.0.1:36555" + }, + "Type": "SocketBridge" + }, + { + "Listen": "{KLALB_Stream}[::0]:23332", + "Bridge": { + "DEFAULT": "MinecraftSocketBridge23332" + }, + "Connect": { + "DEFAULT": "127.0.0.1:36555" + }, + "Type": "SocketBridge" + }, + { + "Listen": "{KLALB_Stream}[::0]:23333", + "Bridge": { + "DEFAULT": "SocketBridge" + }, + "Connect": { + "DEFAULT": "127.0.0.1:5212" + }, + "Type": "SocketBridge" + }, + { + "Listen": "0.0.0.0:25561", + "Bridge": { + "KLALB": "SocketBridge", + "DEFAULT": "MinecraftSocketBridge23330" + }, + "Connect": { + "KLALB": "127.0.0.1:4565", + "DEFAULT": "127.0.0.1:25562" + }, + "Type": "SocketBridge" + }, + { + "Listen": "{KLALB_Stream}[::0]:23330", + "Bridge": { + "DEFAULT": "MinecraftSocketBridge23330" + }, + "Connect": { + "DEFAULT": "127.0.0.1:25562" + }, + "Type": "SocketBridge" + } +] \ No newline at end of file diff --git a/lib/KNElib1.0.jar b/lib/KNElib1.0.jar new file mode 100644 index 0000000..66e202d Binary files /dev/null and b/lib/KNElib1.0.jar differ diff --git a/src/assets/KLALB2.png b/src/assets/KLALB2.png new file mode 100644 index 0000000..06a5ed2 Binary files /dev/null and b/src/assets/KLALB2.png differ diff --git a/src/assets/add.png b/src/assets/add.png new file mode 100644 index 0000000..56ab771 Binary files /dev/null and b/src/assets/add.png differ diff --git a/src/assets/dashboard-3-fill.png b/src/assets/dashboard-3-fill.png new file mode 100644 index 0000000..10a8712 Binary files /dev/null and b/src/assets/dashboard-3-fill.png differ diff --git a/src/assets/delete-bin-fill.png b/src/assets/delete-bin-fill.png new file mode 100644 index 0000000..b7ff677 Binary files /dev/null and b/src/assets/delete-bin-fill.png differ diff --git a/src/assets/edit-fill.png b/src/assets/edit-fill.png new file mode 100644 index 0000000..afb8f5e Binary files /dev/null and b/src/assets/edit-fill.png differ diff --git a/src/assets/graph.png b/src/assets/graph.png new file mode 100644 index 0000000..88209e3 Binary files /dev/null and b/src/assets/graph.png differ diff --git a/src/assets/settings.png b/src/assets/settings.png new file mode 100644 index 0000000..693f134 Binary files /dev/null and b/src/assets/settings.png differ diff --git a/src/assets/speedtest.png b/src/assets/speedtest.png new file mode 100644 index 0000000..68199e2 Binary files /dev/null and b/src/assets/speedtest.png differ diff --git a/src/assets/speedtest2.png b/src/assets/speedtest2.png new file mode 100644 index 0000000..4a3c359 Binary files /dev/null and b/src/assets/speedtest2.png differ diff --git a/src/assets/speedtest3.png b/src/assets/speedtest3.png new file mode 100644 index 0000000..643e639 Binary files /dev/null and b/src/assets/speedtest3.png differ diff --git a/src/klalb_en_US.properties b/src/klalb_en_US.properties index f965e39..7a7dfac 100644 --- a/src/klalb_en_US.properties +++ b/src/klalb_en_US.properties @@ -19,6 +19,8 @@ uploadspeed=Upload speed downloadspeed=Download speed uploadpps=Upload PPS downloadpps=Download PPS +uploaddelay=Upload delay +downloaddelay=Download delay copy=Copy onlinedevices=Online devices monitor=Monitor @@ -37,6 +39,7 @@ invaildtcplisten=TCP listen:Invaild Input invaildudplisten=UDP listen:Invaild Input invaildopenlinetable=Open line table:Invaild Input invaildconnectlinetable=Connect line table:Invaild Input +invaildntpservertable=NTP server addresses:Invaild Input unknown=Unknown viewlinemonitor=View line monitor copylineaddress=Copy line address @@ -44,4 +47,33 @@ copyvirtualaddress=Copy virtual address tryreconnect=Try reconnect forcedisconnect=Force disconnect removeline=Remove line - +time=Time +speermonitor=Speed monitor +delaymonitor=Delay monitor +speed=Speed +delay=Delay +virtualnetsettings=Virtual network settings +tunnelnetsettings=Tunnel network settings +linksettings=Link settings +klalbperf=KLALB-perf Speedtest tool +speedtest=Network speed test +starttest=Start test +testreport=Test report +invaildinput=Invaild input +stoptest=Stop test +bandwidth=Bandwidth +nodeinf=Node information +selectinterface=Select network interface +add=Add +edit=Edit +remove=Remove +networkinterfaceexcept=Network interface except +cancel=Cancel +ok=Ok +currenttime=Current time +timesyncsettings=Time sync settings +ntpservers=NTP server addresses +nodeinfo=Node information +basicinfo=Basic info +overview=Overview +timerange=Time range \ No newline at end of file diff --git a/src/klalb_zh_CN.properties b/src/klalb_zh_CN.properties index 6cd332b..9219d94 100644 --- a/src/klalb_zh_CN.properties +++ b/src/klalb_zh_CN.properties @@ -19,6 +19,8 @@ uploadspeed=上传速度 downloadspeed=下载速度 uploadpps=上传包转发率 downloadpps=下载包转发率 +uploaddelay=上传延迟 +downloaddelay=下载延迟 copy=复制 onlinedevices=在线设备 monitor=监视器 @@ -37,6 +39,7 @@ invaildtcplisten=TCP监听端口:非法输入 invaildudplisten=UDP监听端口:非法输入 invaildopenlinetable=开放线路列表:非法输入 invaildconnectlinetable=自动连接线路列表:非法输入 +invaildntpservertable==NTP授时服务器地址:非法输入 unknown=未知 viewlinemonitor=打开链路监视器 copylineaddress=复制链路地址 @@ -44,4 +47,33 @@ copyvirtualaddress=复制虚拟地址 tryreconnect=立即尝试重连 forcedisconnect=强制断开连接 removeline=强制断开连接并移除 - +time=时间 +speermonitor=速度监视器 +delaymonitor=延迟监视器 +speed=速度 +delay=延迟 +virtualnetsettings=虚拟网络设置 +tunnelnetsettings=隧道网络设置 +linksettings=链路设置 +klalbperf=KLALB-perf测速工具 +speedtest=网速测试 +starttest=开始测试 +testreport=测速报告 +invaildinput=非法输入 +stoptest=停止测试 +bandwidth=带宽 +nodeinf=节点信息 +selectinterface=选择网卡 +add=添加 +edit=编辑 +remove=移除 +networkinterfaceexcept=网卡排除列表 +cancel=取消 +ok=确定 +currenttime=当前时间 +timesyncsettings=时钟同步设置 +ntpservers=NTP授时服务器地址 +nodeinfo=节点信息 +basicinfo=基本信息 +overview=概览 +timerange=时间范围 \ No newline at end of file diff --git a/src/org/kne/cloud/clock/HighAccuracyClock.java b/src/org/kne/cloud/clock/HighAccuracyClock.java new file mode 100644 index 0000000..3e392d6 --- /dev/null +++ b/src/org/kne/cloud/clock/HighAccuracyClock.java @@ -0,0 +1,249 @@ +package org.kne.cloud.clock; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.ReentrantLock; + +import org.kne.math.Long128; + +public class HighAccuracyClock { + + + private final long initialCPUNanoTime; + private final Long128 initialSystemNanoTime; + private volatile AtomicLong baseCPUNanoTime=new AtomicLong(); + private volatile Long128 baseSystemNanoTime; + + private volatile long frequency=1000000000;//1000015000 + + private ReentrantLock lock=new ReentrantLock(); + + private static final Long128 NANOS_PER_MILLIS = Long128.valueOf(TimeUnit.MILLISECONDS.toNanos(1)); + + + private static final Long128 NANOS_PER_SECONDS = Long128.valueOf(TimeUnit.SECONDS.toNanos(1)); + + + public HighAccuracyClock() { + this.initialSystemNanoTime =Long128.valueOf( System.currentTimeMillis() ).multiply(NANOS_PER_MILLIS); + this.initialCPUNanoTime = System.nanoTime(); + this.baseSystemNanoTime=initialSystemNanoTime; + this.baseCPUNanoTime.set(initialCPUNanoTime); + } + + public long getFrequency() { + return frequency; + } + + public void setFrequency(long frequency) { + lock.lock(); + try { + long curr=System.nanoTime(); + long nanoela=curr-baseCPUNanoTime.getAndSet(curr); + baseSystemNanoTime=baseSystemNanoTime.add( Long128.valueOf(nanoela).multiply(this.frequency).divide(NANOS_PER_SECONDS)); + this.frequency = frequency; + }finally { + lock.unlock(); + } + } + + + public void adjustFrequency(long fdelta) { + lock.lock(); + try { + compact(); + this.frequency = frequency+fdelta; + }finally { + lock.unlock(); + } + } + + + private void compact() { + lock.lock(); + try { + long curr=System.nanoTime(); + long nanoela=curr-baseCPUNanoTime.getAndSet(curr); + baseSystemNanoTime=baseSystemNanoTime.add(Long128.valueOf(nanoela).multiply(this.frequency).divide(NANOS_PER_SECONDS)); + }finally { + lock.unlock(); + } + } + + /** + * 获取从1970-01-01开始的当前时间(纳秒精度) + */ + public Long128 getCurrentTimeNanos() { + Long128 mul=Long128.valueOf(System.nanoTime()-baseCPUNanoTime.get()).multiply(frequency); + if(mul.getHigh()!=0) { + compact(); + mul=Long128.valueOf(System.nanoTime()-baseCPUNanoTime.get()).multiply(frequency); + } + return mul.divide(NANOS_PER_SECONDS).add(baseSystemNanoTime); + } + + /** + * 获取从1970-01-01开始的当前时间(毫秒精度) + */ + public long getCurrentTimeMillis() { + return getCurrentTimeNanos().divide(NANOS_PER_MILLIS).longValue(); + } + + /** + * 获取 NTPv4 128 位时间戳 + */ + public BigInteger getCurrentTimeNTP128() { + return NTPTimestamps.nanosToNtp128BitTimestamp(getCurrentTimeNanos()); + } + + /** + * 获取 NTPv4 64 位时间戳 + */ + public BigInteger getCurrentTimeNTP64() { + return NTPTimestamps.ntp128To64(getCurrentTimeNTP128()); + } + + /** + * 获取时钟创建以来经过的时间(纳秒) + */ + public long getElapsedNanos() { + return System.nanoTime() - initialCPUNanoTime; + } + + // ================== 修复的时间同步方法 ================== + + /** + * 强制同步到指定时间(正确版本) + * @param targetNanos 目标时间(从1970年开始的纳秒数) + */ + public void syncToTime(Long128 targetNanos) { + lock.lock(); + try { + baseCPUNanoTime.set( System.nanoTime()); + baseSystemNanoTime=targetNanos; + }finally { + lock.unlock(); + } + } + + /** + * 基于参考时钟进行同步(更安全的方法) + * @param referenceClock 参考时钟 + */ + public void syncToClock(HighAccuracyClock referenceClock) { + syncToClock(referenceClock,BigInteger.ZERO); + } + + + /** + * 基于参考时钟进行同步(更安全的方法) + * @param referenceClock 参考时钟 + * @param delta 网络延迟(纳秒),可选 + */ + public void syncToClock(HighAccuracyClock referenceClock, BigInteger delta) { + if (delta == null) { + delta = BigInteger.ZERO; + } + lock.lock(); + try { + baseCPUNanoTime.set( System.nanoTime()); + baseSystemNanoTime=referenceClock.getCurrentTimeNanos(); + }finally { + lock.unlock(); + } + } + + /** + * 基于NTP时间戳同步 + * @param ntp128Timestamp NTP 128位时间戳 + */ + public void syncToNTPTime(BigInteger ntp128Timestamp) { + Long128 targetNanos = NTPTimestamps.ntp128BitToNanosTimestamp(ntp128Timestamp); + syncToTime(targetNanos); + } + + + + /** + * 调整时钟(用于时间同步) + * @param delta 要调整的纳秒数(正数调快,负数调慢) + */ + public void adjustClock(Long128 delta) { + lock.lock(); + try { + baseSystemNanoTime = baseSystemNanoTime.add(delta); + }finally { + lock.unlock(); + } + } + + /** + * 调整时钟(用于时间同步) + * @param delta 要调整的纳秒数(正数调快,负数调慢) + */ + public void adjustClock(Long128 delta, double adjPercent) { + BigInteger adjustment=new BigDecimal(delta.toBigInteger()).multiply(BigDecimal.valueOf( adjPercent)).toBigInteger(); + lock.lock(); + try { + baseSystemNanoTime = baseSystemNanoTime.add(Long128 .valueOf(adjustment)); + }finally { + lock.unlock(); + } + } + + + + /** + * 获取时钟偏差(当前时间与真实时间的差异) + */ + public Long128 getClockError(Long128 referenceTime) { + return getCurrentTimeNanos().subtract(referenceTime); + } + + /** + * 检查时钟是否同步(误差在允许范围内) + */ + public boolean isSynchronized(Long128 referenceTime, Long128 tolerance) { + Long128 error = getClockError(referenceTime).abs(); + return error.compareTo(tolerance) <= 0; + } + + + // ================== toString 方法 ================== + + + + /** + * 转换为详细格式的字符串(包含纳秒) + */ + public String toString() { + Long128 nanos = getCurrentTimeNanos(); + return NTPTimestamps.nanosSince1970ToString(nanos); + } + + public long getInitialCPUNanoTime() { + return initialCPUNanoTime; + } + + public Long128 getInitialSystemNanoTime() { + return initialSystemNanoTime; + } + + + + public static void main(String[] args) throws InterruptedException { + HighAccuracyClock hac=new HighAccuracyClock(); + while(true) { + System.out.println(hac.getCurrentTimeNanos()); + Thread.sleep(1000); + } + } + + +} \ No newline at end of file diff --git a/src/org/kne/cloud/clock/NTPTimestamps.java b/src/org/kne/cloud/clock/NTPTimestamps.java new file mode 100644 index 0000000..2227a60 --- /dev/null +++ b/src/org/kne/cloud/clock/NTPTimestamps.java @@ -0,0 +1,367 @@ +package org.kne.cloud.clock; + +import java.math.BigInteger; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +import org.kne.math.Long128; + +public class NTPTimestamps { + + // 常量定义 + public static final BigInteger NANOS_PER_SECOND = BigInteger.valueOf(1_000_000_000L); + public static final BigInteger NANOS_PER_MILLIS = BigInteger.valueOf(1_000_000L); + + // NTP 纪元 (1900) 和 Unix 纪元 (1970) 之间的纳秒差 + public static final BigInteger NTP_EPOCH_OFFSET_NS = BigInteger.valueOf(2208988800L) + .multiply(NANOS_PER_SECOND); + + // 2^64 值,用于单位转换 + public static final BigInteger TWO_POW_64 = BigInteger.ONE.shiftLeft(64); + + // 2^32 值,用于 64 位时间戳处理 + public static final BigInteger TWO_POW_32 = BigInteger.ONE.shiftLeft(32); + + // 掩码常量 + public static final BigInteger MASK_32_BIT = new BigInteger("FFFFFFFF", 16); + public static final BigInteger MASK_64_BIT = new BigInteger("FFFFFFFFFFFFFFFF", 16); + + // ================== 核心转换方法 ================== + // 2^32 秒,约 136.192 年,一个 NTP 纪元的长度 + public static final BigInteger SECONDS_PER_ERA = BigInteger.valueOf(0x100000000L); + + public static BigInteger inferNtp64To128(long remote64Bit,BigInteger local128Bit ) { + return inferNtp64To128(toUnsignedBigInteger(remote64Bit),local128Bit); + } + + + /** + * 根据本地 128 位时间戳和网络 64 位时间戳,推断并补全纪元信息 + * + * @param remote64Bit 从网络接收的 64 位 NTP 时间戳 + * @param local128Bit 本地已知的 128 位 NTP 时间戳 + * @return 推断出的完整 128 位 NTP 时间戳 + */ + public static BigInteger inferNtp64To128(BigInteger remote64Bit,BigInteger local128Bit ) { + // 1. 从本地 128 位时间戳中提取纪元号和 64 位时间戳部分 + BigInteger localEra = NTPTimestamps.getEraNumber(local128Bit); + BigInteger local64Bit = NTPTimestamps.getNtp64Timestamp(local128Bit); + + // 3. 计算本地和远程 64 位时间戳的差异 + BigInteger difference = remote64Bit.subtract(local64Bit); + + // 4. 判断纪元关系并推断远程时间戳的纪元 + BigInteger remoteEra; + + // 如果差异很大(超过半个纪元),可能需要调整纪元 + BigInteger halfEra = BigInteger.valueOf(Long.MAX_VALUE); + + if (difference.compareTo(halfEra) > 0) { + // 远程时间戳比本地小很多,可能属于上一个纪元 + remoteEra = localEra.subtract(BigInteger.ONE); + } else if (difference.compareTo(halfEra.negate()) < 0) { + // 远程时间戳比本地大很多,可能属于下一个纪元 + remoteEra = localEra.add(BigInteger.ONE); + } else { + // 差异不大,属于同一个纪元 + remoteEra = localEra; + } + + // 5. 组合纪元号和 64 位时间戳,得到完整的 128 位时间戳 + return NTPTimestamps.ntp64To128(remote64Bit, remoteEra); + } + /** + * 将从1970年开始的纳秒数转换为 NTPv4 128 位时间戳 + * 128位时间戳表示从1900年1月1日起经过的 2⁻⁶⁴ 秒的数量 + */ + public static BigInteger nanosToNtp128BitTimestamp(Long128 nanosSince1970) { + // 1. 计算从 1900 年开始的总纳秒数 + BigInteger totalNanosFrom1900 = nanosSince1970.toBigInteger().add(NTP_EPOCH_OFFSET_NS); + + // 2. 将纳秒转换为 2⁻⁶⁴ 秒单位 + return totalNanosFrom1900.multiply(TWO_POW_64).divide(NANOS_PER_SECOND); + } + + /** + * 从 NTPv4 128 位时间戳转换回从1970年开始的纳秒数 + */ + public static Long128 ntp128BitToNanosTimestamp(BigInteger ntp128Timestamp) { + // 1. 将 2⁻⁶⁴ 秒单位转换回纳秒 + BigInteger totalNanosFrom1900 = ntp128Timestamp.multiply(NANOS_PER_SECOND).divide(TWO_POW_64); + + // 2. 计算从 1970 年开始的总纳秒数 + return Long128.valueOf( totalNanosFrom1900.subtract(NTP_EPOCH_OFFSET_NS)); + } + + + public static BigInteger nanosToNtp128BitTimeInterval(BigInteger nanos) { + // 2. 将纳秒转换为 2⁻⁶⁴ 秒单位 + return nanos.multiply(TWO_POW_64).divide(NANOS_PER_SECOND); + } + + + public static BigInteger ntp128BitToNanosInterval(BigInteger ntp128Timestamp) { + // 1. 将 2⁻⁶⁴ 秒单位转换回纳秒 + BigInteger totalNanosFrom1900 = ntp128Timestamp.multiply(NANOS_PER_SECOND).divide(TWO_POW_64); + + return totalNanosFrom1900; + } + + + // ================== 128位 ↔ 64位 转换 ================== + + /** + * 将 NTP 128 位时间戳转换为 NTP 64 位时间戳 + * 64位时间戳就是128位时间戳的中间64位 + */ + public static BigInteger ntp128To64(BigInteger ntp128Timestamp) { + return ntp128Timestamp.shiftRight(32).and(MASK_64_BIT); + } + + /** + * 将 NTP 64 位时间戳转换为 NTP 128 位时间戳 + * 64位时间戳放在128位时间戳的中间64位,高32位Era和低32位分数为0 + */ + public static BigInteger ntp64To128(BigInteger ntp64Timestamp) { + return ntp64Timestamp.and(MASK_64_BIT).shiftLeft(32); + } + + /** + * 将 NTP 64 位时间戳转换为 NTP 128 位时间戳(指定Era Number) + */ + public static BigInteger ntp64To128(BigInteger ntp64Timestamp, BigInteger eraNumber) { + return eraNumber.and(MASK_32_BIT).shiftLeft(96) + .or(ntp64Timestamp.and(MASK_64_BIT).shiftLeft(32)); + } + + /** + * 从 NTP 128 位时间戳中提取 Era Number(高32位) + */ + public static BigInteger getEraNumber(BigInteger ntp128Timestamp) { + return ntp128Timestamp.shiftRight(96).and(MASK_32_BIT); + } + + /** + * 从 NTP 128 位时间戳中提取 64 位时间戳(中间64位) + */ + public static BigInteger getNtp64Timestamp(BigInteger ntp128Timestamp) { + return ntp128Timestamp.shiftRight(32).and(MASK_64_BIT); + } + + /** + * 从 NTP 128 位时间戳中提取分数部分(低32位) + */ + public static BigInteger getFraction(BigInteger ntp128Timestamp) { + return ntp128Timestamp.and(MASK_32_BIT); + } + + // ================== 工具方法 ================== + + /** + * 从毫秒和纳秒偏移构造 BigInteger 纳秒 + */ + public static Long128 toNanosSince1970(long unixTimeMillis, long nanosOffset) { + return Long128.valueOf(unixTimeMillis) + .multiply(Long128.valueOf( NANOS_PER_MILLIS)) + .add(Long128.valueOf(nanosOffset)); + } + + /** + * 从 BigInteger 纳秒提取毫秒和纳秒偏移 + */ + public static long[] toMillisAndNanos(Long128 nanosSince1970) { + Long128[] millisAndNanos = nanosSince1970.divideAndRemainder(Long128.valueOf( NANOS_PER_MILLIS)); + return new long[]{millisAndNanos[0].longValue(), millisAndNanos[1].longValue()}; + } + + /** + * 计算两个 128 位时间戳之间的时间差(纳秒) + */ + public static BigInteger calculateTimeDifference(BigInteger timestamp1, BigInteger timestamp2) { + BigInteger diff = timestamp2.subtract(timestamp1); + return diff.multiply(NANOS_PER_SECOND).divide(TWO_POW_64); + } + + + + /** + * 将 64 位 NTP 时间戳分解为秒数和分数 + */ + public static BigInteger[] parseNtp64Timestamp(BigInteger ntp64Timestamp) { + BigInteger seconds = ntp64Timestamp.shiftRight(32).and(MASK_32_BIT); + BigInteger fraction = ntp64Timestamp.and(MASK_32_BIT); + return new BigInteger[]{seconds, fraction}; + } + + /** + * 从秒数和分数构建 64 位 NTP 时间戳 + */ + public static BigInteger buildNtp64Timestamp(BigInteger seconds, BigInteger fraction) { + return seconds.and(MASK_32_BIT).shiftLeft(32).or(fraction.and(MASK_32_BIT)); + } + + // ================== 测试代码 ================== + + public static void main(String[] args) { + System.out.println("=== NTPv4 128位/64位时间戳转换测试 ==="); + + // 测试当前时间 + testCurrentTime(); + + // 测试 128位 ↔ 64位 转换 + test128To64Conversion(); + + // 测试 Era Number 处理 + testEraNumberHandling(); + + // 测试边界值 + testBoundaryValues(); + } + + private static void testCurrentTime() { + System.out.println("\n=== 当前时间测试 ==="); + + Long128 nanosSince1970 = toNanosSince1970(System.currentTimeMillis(), 123456); + BigInteger ntp128 = nanosToNtp128BitTimestamp(nanosSince1970); + BigInteger ntp64 = ntp128To64(ntp128); + + System.out.println("从1970年开始的纳秒数: " + nanosSince1970); + System.out.println("NTP 128-bit: 0x" + ntp128.toString(16).toUpperCase()); + System.out.println("NTP 64-bit: 0x" + ntp64.toString(16).toUpperCase()); + + // 反向转换验证 + BigInteger recovered128 = ntp64To128(ntp64); + Long128 recoveredNanos = ntp128BitToNanosTimestamp(recovered128); + + System.out.println("恢复的纳秒数: " + recoveredNanos); + System.out.println("转换正确: " + (nanosSince1970.equals(recoveredNanos) ? "✅" : "❌")); + } + + private static void test128To64Conversion() { + System.out.println("\n=== 128位 ↔ 64位 转换测试 ==="); + + // 创建一个测试用的 128 位时间戳 + BigInteger test128 = new BigInteger("EC652B7E912F00B81234567890ABCDEF", 16); + + BigInteger ntp64 = ntp128To64(test128); + BigInteger recovered128 = ntp64To128(ntp64); + + System.out.println("原始128位: 0x" + test128.toString(16).toUpperCase()); + System.out.println("转换64位: 0x" + ntp64.toString(16).toUpperCase()); + System.out.println("恢复128位: 0x" + recovered128.toString(16).toUpperCase()); + + // 验证中间64位相同 + BigInteger original64Part = getNtp64Timestamp(test128); + System.out.println("转换正确: " + (original64Part.equals(ntp64) ? "✅" : "❌")); + } + + private static void testEraNumberHandling() { + System.out.println("\n=== Era Number 处理测试 ==="); + + BigInteger ntp64 = new BigInteger("EC652B7E912F00B8", 16); + BigInteger eraNumber = new BigInteger("1", 16); // Era 1 + + BigInteger ntp128WithEra = ntp64To128(ntp64, eraNumber); + BigInteger extractedEra = getEraNumber(ntp128WithEra); + BigInteger extracted64 = getNtp64Timestamp(ntp128WithEra); + + System.out.println("设置 Era: 0x" + eraNumber.toString(16).toUpperCase()); + System.out.println("提取 Era: 0x" + extractedEra.toString(16).toUpperCase()); + System.out.println("提取 64位: 0x" + extracted64.toString(16).toUpperCase()); + System.out.println("128位值: 0x" + ntp128WithEra.toString(16).toUpperCase()); + System.out.println("Era 正确: " + (eraNumber.equals(extractedEra) ? "✅" : "❌")); + System.out.println("64位正确: " + (ntp64.equals(extracted64) ? "✅" : "❌")); + } + + private static void testBoundaryValues() { + System.out.println("\n=== 边界值测试 ==="); + + // 测试最大值 + BigInteger max64 = MASK_64_BIT; // 0xFFFFFFFFFFFFFFFF + BigInteger max128 = ntp64To128(max64); + BigInteger recovered64 = ntp128To64(max128); + + System.out.println("最大64位: 0x" + max64.toString(16).toUpperCase()); + System.out.println("转换128位: 0x" + max128.toString(16).toUpperCase()); + System.out.println("恢复64位: 0x" + recovered64.toString(16).toUpperCase()); + System.out.println("最大值转换正确: " + (max64.equals(recovered64) ? "✅" : "❌")); + + // 测试 Era Number 边界 + BigInteger maxEra = MASK_32_BIT; // 0xFFFFFFFF + BigInteger test64 = new BigInteger("1234567890ABCDEF", 16); + BigInteger ntp128MaxEra = ntp64To128(test64, maxEra); + BigInteger extractedMaxEra = getEraNumber(ntp128MaxEra); + + System.out.println("最大Era转换正确: " + (maxEra.equals(extractedMaxEra) ? "✅" : "❌")); + } + + /** + * 生成时间序列测试 + */ + public static void testTimeSeries() { + System.out.println("\n=== 时间序列测试 ==="); + + Long128 startNanos = toNanosSince1970(System.currentTimeMillis(), 0); + BigInteger start128 = nanosToNtp128BitTimestamp(startNanos); + + for (int i = 0; i < 5; i++) { + Long128 offsetNanos = Long128.valueOf(i).multiply(Long128.valueOf( NANOS_PER_SECOND).divide(Long128.valueOf(10))); + Long128 currentNanos = startNanos.add(offsetNanos); + BigInteger current128 = nanosToNtp128BitTimestamp(currentNanos); + BigInteger current64 = ntp128To64(current128); + + long[] time = toMillisAndNanos(currentNanos); + System.out.printf("时间: %d ms + %d ns -> 64位: %s -> 128位: %s%n", + time[0], time[1], + current64.toString(16).toUpperCase(), + current128.toString(16).toUpperCase()); + } + } + + + // 日期时间格式化器 + private static final DateTimeFormatter DEFAULT_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + private static final DateTimeFormatter DETAILED_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.n"); + public static String nanosSince1970ToString(Long128 nanos) { + Long128 millis = nanos.divide(Long128.valueOf(1_000_000)); + Long128 nanosPart = nanos.mod(Long128.valueOf(1_000_000)); + + Instant instant = Instant.ofEpochMilli(millis.longValue()); + LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); + + return String.format("%s.%06d", + DEFAULT_FORMATTER.format(dateTime), + nanosPart.longValue()); + } + + /** + * 将 128 位时间戳转换为可读字符串 + */ + public static String ntp128ToString(BigInteger ntp128Timestamp) { + Long128 nanosSince1970 = ntp128BitToNanosTimestamp(ntp128Timestamp); + return nanosSince1970ToString(nanosSince1970); + } + + /** + * 将 64 位时间戳转换为可读字符串 + */ + public static String ntp64ToString(BigInteger ntp64Timestamp) { + Long128 nanosSince1970 = ntp128BitToNanosTimestamp(ntp64To128( ntp64Timestamp)); + return nanosSince1970ToString(nanosSince1970); + } + + public static BigInteger toUnsignedBigInteger(long unsignedLong) { + if (unsignedLong >= 0) { + return BigInteger.valueOf(unsignedLong); + } else { + // 对于负数,通过添加 2^64 来转换为无符号表示 + return BigInteger.valueOf(unsignedLong & 0x7FFFFFFFFFFFFFFFL) + .setBit(63); + } + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/klalb/uitool/ListSettingItem.java b/src/org/kne/cloud/klalb/uitool/ListSettingItem.java index 2aa3fc7..395c32e 100644 --- a/src/org/kne/cloud/klalb/uitool/ListSettingItem.java +++ b/src/org/kne/cloud/klalb/uitool/ListSettingItem.java @@ -7,6 +7,8 @@ import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; +import java.net.NetworkInterface; +import java.util.List; import java.util.function.Consumer; import java.util.function.Supplier; @@ -63,6 +65,8 @@ public abstract class ListSettingItem extends SettingItem { jbt3x.setIcon(new ImageIcon(ImageIO .read(ListSettingItem.class.getResourceAsStream("/assets/add.png")).getScaledInstance(dss.width-2, dss.height-2, Image.SCALE_SMOOTH))); } catch (IOException e) { e.printStackTrace(); + }catch (IllegalArgumentException e) { + e.printStackTrace(); } jbt3x.setSize(dss); jbt3x.setPreferredSize(dss); @@ -70,8 +74,9 @@ public abstract class ListSettingItem extends SettingItem { @Override public void actionPerformed(ActionEvent e) { - T x=createEmpty(); - runEdit(x); + List x=createEmpty(); + if(x!=null&&!x.isEmpty()) + runEdit(x.get(0)); } }); JButton jbedit=new JButton(); @@ -80,6 +85,8 @@ public abstract class ListSettingItem extends SettingItem { jbedit.setIcon(new ImageIcon(ImageIO .read(ListSettingItem.class.getResourceAsStream("/assets/edit-fill.png")).getScaledInstance(dss.width-2, dss.height-2, Image.SCALE_SMOOTH))); } catch (IOException e) { e.printStackTrace(); + }catch (IllegalArgumentException e) { + e.printStackTrace(); } jbedit.setSize(dss); jbedit.setPreferredSize(dss); @@ -99,6 +106,8 @@ public abstract class ListSettingItem extends SettingItem { jbt4x.setIcon(new ImageIcon(ImageIO .read(ListSettingItem.class.getResourceAsStream("/assets/delete-bin-fill.png")).getScaledInstance(dss.width-2, dss.height-2, Image.SCALE_SMOOTH))); } catch (IOException e) { e.printStackTrace(); + }catch (IllegalArgumentException e) { + e.printStackTrace(); } jbt4x.setSize(dss); jbt4x.setPreferredSize(dss); @@ -125,7 +134,7 @@ public abstract class ListSettingItem extends SettingItem { jp.add(jbt4x); } abstract protected void runEdit(T val) ; -abstract protected T createEmpty() ; +abstract protected List createEmpty() ; public void doAdd(T v) { boolean b=true; for (int i = 0; i < list.getModel().getSize(); i++) { diff --git a/src/org/kne/cloud/network/BufferedArena.java b/src/org/kne/cloud/network/BufferedArena.java new file mode 100644 index 0000000..a3a72a2 --- /dev/null +++ b/src/org/kne/cloud/network/BufferedArena.java @@ -0,0 +1,177 @@ +package org.kne.cloud.network; + +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.MemorySegment.Scope; +import java.lang.ref.PhantomReference; +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; +import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.ReentrantLock; + +public class BufferedArena implements Arena{ + private static long blockSize=10*1024L*1024L; + private volatile PreAlloc buffer; + private static ReferenceQueue refq=new ReferenceQueue<>(); + private static MemorySegmentPool msp=new MemorySegmentPool(1000, blockSize,true); + + public static long getBlockSize() { + return blockSize; + } + + + + public static void setBlockSize(long blockSizex) { + blockSize = blockSizex; + } + + + + private ReentrantLock lock=new ReentrantLock(); + + private class PreAlloc{ + private MemorySegment segment; + private AtomicLong pos=new AtomicLong(0); + private AtomicLong refs=new AtomicLong(0); + public MemorySegment getSegment() { + return segment; + } + public AtomicLong getPos() { + return pos; + } + public PreAlloc(MemorySegment segment) { + super(); + this.segment = segment; + } + public long byteSize() { + return segment.byteSize(); + } + public AtomicLong getRefs() { + return refs; + } + + } + + private void allocateNew(long blockSize2) { + lock.lock(); + try { + //buffer=Arena.ofAuto().allocate(blockSize); + MemorySegment raw=msp.borrow(); + buffer=new PreAlloc(raw); + + }finally { + lock.unlock(); + } + } + + + + static { + Thread t= new Thread(()->{ + while(true) { + try { + Reference ref; + ref = refq.remove(); + if(ref!=null) { + ref.clear(); + } + } catch (InterruptedException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } + } + }); + t.setDaemon(true); + t.setPriority(Thread.MAX_PRIORITY-1); + t.start(); + } + + + + public BufferedArena() { + super(); + allocateNew(blockSize); + } + + @Override + public MemorySegment allocate(long byteSize, long byteAlignment) { + if(byteSize>blockSize) + throw new IndexOutOfBoundsException("byteSize can't large than buffer block"); + long pos; + PreAlloc bufferx; + do{ + bufferx=this.buffer; + pos=bufferx.getPos().getAndAdd(byteSize); + if(pos+byteSize>bufferx.byteSize()) { + allocateNew(blockSize); + }else { + break; + } + }while(true); + bufferx.getRefs().incrementAndGet(); + MemorySegment sliced=bufferx.getSegment().asSlice(pos, byteSize); + new MemorySegmentPhantomReference(sliced, refq, bufferx, msp); + return sliced; + + } + + @Override + public Scope scope() { + return Arena.ofAuto().scope(); + } + + @Override + public void close() { + Arena.ofAuto().close(); + } + public static BufferedArena ofBuffered() { + return new BufferedArena(); + } + +private class MemorySegmentPhantomReference extends PhantomReference{ + + private static AtomicReference first=new AtomicReference<>(null); + + private AtomicReference next=new AtomicReference<>(null); + private AtomicReference prev=new AtomicReference<>(null); + + private PreAlloc father; + private MemorySegmentPool pool; + + public MemorySegmentPhantomReference(MemorySegment referent, ReferenceQueue q,PreAlloc bufferx,MemorySegmentPool pool) { + super(referent, q); + this.father=bufferx; + this.pool=pool; + insert(); + } + + private void insert() { + MemorySegmentPhantomReference refn= first.getAndSet(this); + if(refn!=null) { + next.set(refn); + refn.prev.set(this); + } + } + + private void remove() { + MemorySegmentPhantomReference prevn= prev.getAndSet(null); + MemorySegmentPhantomReference nextn=next.getAndSet(null); + if(prevn!=null) + prevn.next.set(nextn); + if(nextn!=null) + nextn.prev.set(prevn); + } + + @Override + public void clear() { + if(father.getRefs().decrementAndGet()<=0) { + if(buffer!=father) + pool.back(father.getSegment()); + } + remove(); + super.clear(); + } + } +} diff --git a/src/org/kne/cloud/network/BufferedChannel.java b/src/org/kne/cloud/network/BufferedChannel.java new file mode 100644 index 0000000..b9440fd --- /dev/null +++ b/src/org/kne/cloud/network/BufferedChannel.java @@ -0,0 +1,445 @@ +package org.kne.cloud.network; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.ReentrantLock; + +/** + * 修复的BufferedChannel,解决Socket关闭时的数据一致性问题 + */ +public class BufferedChannel implements ReadableByteChannel, WritableByteChannel, ScatteringByteChannel, GatheringByteChannel { + private final ReadableByteChannel inputChannel; + private final WritableByteChannel outputChannel; + private final ByteBuffer readBuffer; + private final ByteBuffer writeBuffer; + + private final ReentrantLock readLock = new ReentrantLock(); + private final ReentrantLock writeLock = new ReentrantLock(); + + private final AtomicBoolean closed = new AtomicBoolean(false); + private final AtomicBoolean inputShutdown = new AtomicBoolean(false); + private final AtomicBoolean outputShutdown = new AtomicBoolean(false); + + public BufferedChannel(ReadableByteChannel channel, int bufferSize) { + this(channel, null, bufferSize); + } + + public BufferedChannel(WritableByteChannel channel, int bufferSize) { + this(null, channel, bufferSize); + } + + public BufferedChannel(ReadableByteChannel inputChannel, WritableByteChannel outputChannel, int bufferSize) { + this.inputChannel = inputChannel; + this.outputChannel = outputChannel; + this.readBuffer = ByteBuffer.allocateDirect(bufferSize); + this.writeBuffer = ByteBuffer.allocateDirect(bufferSize); + + // 更安全的初始化 + this.readBuffer.limit(0); // 明确设置为空 + this.writeBuffer.clear(); + } + + @Override + public int read(ByteBuffer dst) throws IOException { + if (closed.get() || inputShutdown.get()) { + throw new ClosedChannelException(); + } + + readLock.lock(); + try { + // 检查底层通道是否仍然打开 + if (inputChannel != null && !inputChannel.isOpen()) { + inputShutdown.set(true); + return handleInputShutdown(); + } + + int totalRead = 0; + boolean eofEncountered = false; + + while (dst.hasRemaining() && !eofEncountered) { + // 如果读缓冲区有数据,先从中读取 + if (readBuffer.hasRemaining()) { + int bytesToCopy = Math.min(readBuffer.remaining(), dst.remaining()); + + // 使用绝对位置操作,避免修改缓冲区状态 + int oldlimit=readBuffer.limit(); + readBuffer.limit(readBuffer.position()+bytesToCopy); + dst.put(readBuffer); + readBuffer.limit(oldlimit); + + totalRead += bytesToCopy; + continue; + } + + // 读缓冲区空了,需要重新填充 + readBuffer.clear(); + int bytesRead; + try { + bytesRead = inputChannel.read(readBuffer); + } catch (IOException e) { + // 读取时发生IO异常,标记为关闭 + inputShutdown.set(true); + throw e; + } + + if (bytesRead == -1) { + // 到达EOF + inputShutdown.set(true); + eofEncountered = true; + } else if (bytesRead == 0) { + // 没有数据可用,可能是非阻塞模式 + break; + } else { + readBuffer.flip(); + } + } + + // 如果遇到EOF且没有读取到任何数据,返回-1 + if (eofEncountered && totalRead == 0) { + return -1; + } + + return totalRead; + + } finally { + readLock.unlock(); + } + } + + /** + * 处理输入关闭的情况 + */ + private int handleInputShutdown() throws IOException { + // 如果读缓冲区还有剩余数据,先返回这些数据 + if (readBuffer.hasRemaining()) { + return readBuffer.remaining(); + } + return -1; + } + + @Override + public long read(ByteBuffer[] dsts) throws IOException { + return read(dsts, 0, dsts.length); + } + + @Override + public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { + if (closed.get() || inputShutdown.get()) { + throw new ClosedChannelException(); + } + + long totalRead = 0; + for (int i = offset; i < offset + length; i++) { + ByteBuffer dst = dsts[i]; + if (dst == null) { + throw new NullPointerException("Destination buffer is null"); + } + + int bytesRead = read(dst); + if (bytesRead == -1) { + // 只有在没有读取任何数据时才返回-1 + return totalRead > 0 ? totalRead : -1; + } + totalRead += bytesRead; + } + + return totalRead; + } + + @Override + public int write(ByteBuffer src) throws IOException { + if (closed.get() || outputShutdown.get()) { + throw new ClosedChannelException(); + } + + writeLock.lock(); + try { + // 检查底层通道是否仍然打开 + if (outputChannel != null && !outputChannel.isOpen()) { + outputShutdown.set(true); + throw new ClosedChannelException(); + } + + int totalWritten = 0; + + while (src.hasRemaining()) { + // 如果写缓冲区有空间,先填充 + if (writeBuffer.hasRemaining()) { + int bytesToCopy = Math.min(writeBuffer.remaining(), src.remaining()); + int oldlimit= src.limit(); + src.limit(src.position()+bytesToCopy); + writeBuffer.put(src); + src.limit(oldlimit); + + totalWritten += bytesToCopy; + } + + // 如果写缓冲区满了或者源数据还很多,刷新缓冲区 + if (!writeBuffer.hasRemaining() ) { + try { + flushInternal(); + } catch (IOException e) { + outputShutdown.set(true); + throw e; + } + } + } + return totalWritten; + + } finally { + writeLock.unlock(); + } + } + + @Override + public long write(ByteBuffer[] srcs) throws IOException { + return write(srcs, 0, srcs.length); + } + + @Override + public long write(ByteBuffer[] srcs, int offset, int length) throws IOException { + if (closed.get() || outputShutdown.get()) { + throw new ClosedChannelException(); + } + + long totalWritten = 0; + for (int i = offset; i < offset + length; i++) { + ByteBuffer src = srcs[i]; + if (src == null) { + throw new NullPointerException("Source buffer is null"); + } + + int bytesWritten = write(src); + totalWritten += bytesWritten; + } + + return totalWritten; + } + + /** + * 安全的刷新方法 + */ + public void flush() throws IOException { + if (closed.get()) { + throw new ClosedChannelException(); + } + + if (outputChannel == null || outputShutdown.get()) { + return; + } + + writeLock.lock(); + try { + flushInternal(); + } catch (IOException e) { + outputShutdown.set(true); + throw e; + } finally { + writeLock.unlock(); + } + } + + /** + * 内部刷新方法,假设已经持有writeLock + */ + private void flushInternal() throws IOException { + if (writeBuffer.position() > 0) { + writeBuffer.flip(); + + try { + while (writeBuffer.hasRemaining()) { + int written = outputChannel.write(writeBuffer); + // System.out.println("发送"+written); + if (written == 0) { + // 可能遇到阻塞或关闭 + if (!outputChannel.isOpen()) { + outputShutdown.set(true); + throw new ClosedChannelException(); + } + // 给其他操作机会 + Thread.yield(); + } + } + } finally { + // 无论发生什么,确保写缓冲区处于可写状态 + writeBuffer.clear(); + } + } + } + + /** + * 安全的关闭方法 + */ + @Override + public void close() throws IOException { + if (!closed.compareAndSet(false, true)) { + return; // 已经关闭 + } + + IOException exception = null; + + // 先刷新输出缓冲区 + if (outputChannel != null && !outputShutdown.get()) { + writeLock.lock(); + try { + if (writeBuffer.position() > 0) { + try { + flushInternal(); + } catch (IOException e) { + exception = e; + } + } + } finally { + writeLock.unlock(); + } + } + + // 关闭底层通道 + try { + if (inputChannel != null) { + inputChannel.close(); + } + } catch (IOException e) { + if (exception == null) { + exception = e; + } else { + exception.addSuppressed(e); + } + } + + try { + if (outputChannel != null) { + outputChannel.close(); + } + } catch (IOException e) { + if (exception == null) { + exception = e; + } else { + exception.addSuppressed(e); + } + } + + // 清理缓冲区状态 + readLock.lock(); + try { + readBuffer.clear(); + readBuffer.limit(0); // 标记为已清空 + } finally { + readLock.unlock(); + } + + writeLock.lock(); + try { + writeBuffer.clear(); + } finally { + writeLock.unlock(); + } + + // 设置关闭状态 + inputShutdown.set(true); + outputShutdown.set(true); + + if (exception != null) { + throw exception; + } + } + + /** + * 优雅关闭 - 只关闭输入或输出 + */ + public void shutdownInput() throws IOException { + inputShutdown.set(true); + readLock.lock(); + try { + readBuffer.clear(); + readBuffer.limit(0); + } finally { + readLock.unlock(); + } + + if (inputChannel instanceof SocketChannel) { + ((SocketChannel) inputChannel).shutdownInput(); + } + } + + public void shutdownOutput() throws IOException { + outputShutdown.set(true); + writeLock.lock(); + try { + if (writeBuffer.position() > 0) { + flushInternal(); + } + } finally { + writeLock.unlock(); + } + + if (outputChannel instanceof SocketChannel) { + ((SocketChannel) outputChannel).shutdownOutput(); + } + } + + @Override + public boolean isOpen() { + return !closed.get() && + (inputChannel == null || inputChannel.isOpen()) && + (outputChannel == null || outputChannel.isOpen()); + } + + /** + * 检查是否还有可读数据(包括缓冲区中的) + */ + public boolean hasRemaining() throws IOException { + if (closed.get() || inputShutdown.get()) { + return false; + } + + readLock.lock(); + try { + return readBuffer.hasRemaining() || + (inputChannel != null && inputChannel.isOpen()); + } finally { + readLock.unlock(); + } + } + + /** + * 获取缓冲区状态信息(用于调试) + */ + public String getBufferState() { + readLock.lock(); + writeLock.lock(); + try { + return String.format( + "ReadBuffer[pos=%d, lim=%d, cap=%d], WriteBuffer[pos=%d, lim=%d, cap=%d], " + + "closed=%b, inputShutdown=%b, outputShutdown=%b", + readBuffer.position(), readBuffer.limit(), readBuffer.capacity(), + writeBuffer.position(), writeBuffer.limit(), writeBuffer.capacity(), + closed.get(), inputShutdown.get(), outputShutdown.get() + ); + } finally { + writeLock.unlock(); + readLock.unlock(); + } + } + + // 其他方法保持不变... + public int available() throws IOException { + if (closed.get() || inputShutdown.get()) { + return 0; + } + + readLock.lock(); + try { + return readBuffer.remaining(); + } finally { + readLock.unlock(); + } + } + + public long skip(long n) throws IOException { + // 实现保持不变... + return 0; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ByteBufferAllocator.java b/src/org/kne/cloud/network/ByteBufferAllocator.java index bdb6017..6fb5734 100644 --- a/src/org/kne/cloud/network/ByteBufferAllocator.java +++ b/src/org/kne/cloud/network/ByteBufferAllocator.java @@ -1,5 +1,8 @@ package org.kne.cloud.network; +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; +import java.lang.foreign.SegmentAllocator; import java.lang.ref.Cleaner; import java.lang.ref.PhantomReference; import java.lang.ref.Reference; @@ -18,66 +21,41 @@ import org.kne.debug.TimeDebugger; import jdk.internal.misc.Unsafe; public class ByteBufferAllocator { - private List bbfps=new ArrayList<>(); - - private ByteBufferPool[]bbfpsarr; - - - private ReferenceQueue refq=new ReferenceQueue<>(); - private boolean isDirect; - - public ByteBufferAllocator(boolean isDirect) { - this.isDirect=isDirect; - int i=1; - int maxi=0; - int mps=16; - for (int j = 0; j < 18; j++) { - int count=100; - mps+=count; - bbfps.add(new ByteBufferPool(mps, i,isDirect)); - maxi=i; - i<<=1; - } - bbfpsarr=new ByteBufferPool[maxi]; - for (int j = 0; j < bbfpsarr.length; j++) { - bbfpsarr[j]=getByteBufferPool(j); - } - - Thread t= new Thread(()->{ + static Thread t; + static { + t=new Thread(()->{ while(true) { + System.gc(); try { - Reference ref; - ref = refq.remove(); - if(ref!=null) { - ref.clear(); - } + Thread.sleep(1000); } catch (InterruptedException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); } } - }); + }); + t.setDaemon(true); t.setPriority(Thread.MAX_PRIORITY-1); t.start(); } - public ByteBuffer allocate(int capacity) { - if(true) { - return allocateHeap(capacity); - } - //new Exception().printStackTrace(); - ByteBufferPool bbfp=bbfpsarr[capacity]; - ByteBuffer bbf=null; - try { - bbf=bbfp.borrow(); - }catch(OutOfMemoryError err) { - System.gc(); - Thread.yield(); - bbf=bbfp.borrow(); - } - ByteBuffer bbfs=bbf.slice(0, capacity); + + public ByteBufferAllocator(boolean isDirect) { - new ByteBufferPhantomReference(bbfs,refq,bbf,bbfp); - return bbfs; + } + public ByteBuffer allocate(int capacity) { + //if(capacity<1024) + return allocateHeap(capacity); + //return allocateNative(capacity); + + + } + //private Arena ar=BufferedArena.ofBuffered(); + private Arena ara=Arena.ofAuto(); + public ByteBuffer allocateNative(int capacity) { + //return ((jdk.internal.foreign.ArenaImpl)Arena.ofAuto()).allocateNoInit(capacity,1).asByteBuffer(); + + ByteBuffer buf=Arena.ofAuto().allocate(capacity).asByteBuffer(); + if(buf.capacity()!=capacity) + throw new InternalError(); + return buf; } private static jdk.internal.misc.Unsafe usf; private static Method meth; @@ -97,30 +75,23 @@ public class ByteBufferAllocator { } } - private static ByteBuffer allocateHeap(int capacity) { - //return ByteBuffer.wrap((byte[]) usf.allocateUninitializedArray(byte.class, capacity)); + public static byte[] allocateArray(int capacity) { if(usf!=null&&meth!=null) { - try { - return ByteBuffer.wrap((byte[]) usf.allocateUninitializedArray(byte.class, capacity)); - } catch (Exception e) { - return ByteBuffer.wrap(new byte[capacity]); - } - }else { - return ByteBuffer.wrap(new byte[capacity]); - } - } - - - private ByteBufferPool getByteBufferPool(int capacity) { - int elen=0; - for (int i = 0; i < bbfps.size(); i++) { - ByteBufferPool bfp=bbfps.get(i); - if(capacity<=(elen= bfp.getLength())) { - return bfp; + try { + return (byte[]) usf.allocateUninitializedArray(byte.class, capacity); + } catch (Exception e) { + return new byte[capacity]; + } + }else { + return new byte[capacity]; } - } - throw new RuntimeException("capacity:"+capacity+">"+elen); } + + public static ByteBuffer allocateHeap(int capacity) { + return ByteBuffer.wrap((byte[])allocateArray(capacity)) ; + } + + private static class ByteBufferPhantomReference extends PhantomReference{ private static AtomicReference first=new AtomicReference<>(null); diff --git a/src/org/kne/cloud/network/DatagramServerSocket.java b/src/org/kne/cloud/network/DatagramServerSocket.java index 0b5286f..888d68e 100644 --- a/src/org/kne/cloud/network/DatagramServerSocket.java +++ b/src/org/kne/cloud/network/DatagramServerSocket.java @@ -39,7 +39,7 @@ public class DatagramServerSocket implements java.io.Closeable{ private final Object stateLock = new Object(); private BlockingQueue recs; private InetSocketAddress bindpoint; - + @@ -150,7 +150,7 @@ public class DatagramServerSocket implements java.io.Closeable{ @Override public void run() { try { - while(true) { + while(!closed) { byte[]data=dataarraypool.borrow(); DatagramPacket dp=new DatagramPacket(data,data.length); datagramSocket.receive(dp); @@ -179,6 +179,10 @@ public class DatagramServerSocket implements java.io.Closeable{ public void removeClient(SubDatagramSocket subDatagramSocket) { clients.remove(subDatagramSocket.getRemoteSocketAddress()); } + + public void close() { + datagramSocket.close(); + } } public DatagramSocket accept()throws IOException{ @@ -341,6 +345,10 @@ public class DatagramServerSocket implements java.io.Closeable{ @Override public void close() { closed=true; + for (Iterator iterator = skts.iterator(); iterator.hasNext();) { + DatagramDistributor datagramSocket = (DatagramDistributor) iterator.next(); + datagramSocket.close(); + } } public SocketAddress getLocalSocketAddress() { diff --git a/src/org/kne/cloud/network/MemorySegmentPool.java b/src/org/kne/cloud/network/MemorySegmentPool.java new file mode 100644 index 0000000..ebec1ef --- /dev/null +++ b/src/org/kne/cloud/network/MemorySegmentPool.java @@ -0,0 +1,83 @@ +package org.kne.cloud.network; + +import java.lang.foreign.Arena; +import java.lang.foreign.MemorySegment; +import java.nio.ByteBuffer; +import java.util.Queue; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReferenceArray; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import org.kne.concurrent.SpinLock; +import org.kne.debug.TimeDebugger; + + +public class MemorySegmentPool { + private AtomicReferenceArray< MemorySegment> rec; + private volatile AtomicInteger pos=new AtomicInteger( 0); + //private Lock lock=new SpinLock(); + + private int maxcount; + private long length; + private int mcj; + private boolean direct; + public MemorySegmentPool(int maxcount, long length,boolean direct) { + super(); + this.maxcount = maxcount; + this.length = length; + this.direct=direct; + rec=new AtomicReferenceArray(maxcount); + mcj= rec.length()-1; + } + public MemorySegmentPool(int maxcount, int length) { + this(maxcount, length, true); + } + public void back(MemorySegment b) { + if(b.byteSize()!=length) + throw new IllegalArgumentException("wrong length"); + + + if(pos.get()<=mcj) { + int d=pos.getAndIncrement(); + if(d>mcj) + d=mcj; + if(d<0) + d=0; + rec.compareAndSet(d,null,b); + } + + } + public MemorySegment borrow() { + MemorySegment b=null; + + if(pos.get()>0) { + int d=pos.decrementAndGet(); + if(d>mcj) + d=mcj; + if(d<0) + d=0; + b=rec.getAndSet(d,null); + } + + if(b==null) { + ByteBufferAllocator.t.interrupt(); + if(direct) { + b=((jdk.internal.foreign.ArenaImpl)Arena.ofAuto()).allocateNoInit(length,1); + System.out.println(length); + }else { + b=MemorySegment.ofArray(new byte[(int) length]); + } + } + return b; + } + public int getMaxCount() { + return maxcount; + } + public long getLength() { + return length; + } + +} diff --git a/src/org/kne/cloud/network/MultipurposeSocketAddress.java b/src/org/kne/cloud/network/MultipurposeSocketAddress.java index 5d411d0..9d444e0 100644 --- a/src/org/kne/cloud/network/MultipurposeSocketAddress.java +++ b/src/org/kne/cloud/network/MultipurposeSocketAddress.java @@ -99,6 +99,31 @@ public class MultipurposeSocketAddress implements Serializable{ return Objects.equals(host, other.host) && port == other.port && Objects.equals(ps, other.ps) && Objects.equals(type, other.type); } + + public boolean equals2(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MultipurposeSocketAddress other = (MultipurposeSocketAddress) obj; + InetAddress addra=null; + try { + addra = InetAddress.getByName(host); + } catch (UnknownHostException e) { + } + InetAddress addrb=null; + try { + addrb = InetAddress.getByName(other.host); + } catch (UnknownHostException e) { + } + boolean hostequals=Objects.equals(addra, addrb); + + return hostequals && port == other.port && Objects.equals(ps, other.ps) + && Objects.equals(type, other.type); + } + public MultipurposeSocketAddress(String host2, int port2) { this("TCP", host2, port2); } @@ -116,6 +141,8 @@ public class MultipurposeSocketAddress implements Serializable{ port=remoteSocketAddress.getPort(); this.type=type; } + + public String getHost() { return host; } @@ -125,6 +152,11 @@ public class MultipurposeSocketAddress implements Serializable{ public String getType() { return type; } + + public InetSocketAddress getSocketAddress() { + return new InetSocketAddress(host, port); + } + @Override public String toString() { StringBuilder sb=new StringBuilder(); @@ -367,6 +399,23 @@ public class MultipurposeSocketAddress implements Serializable{ } return dgd; } + public DatagramSocket listenDatagramSocket() throws UnknownHostException, IOException { + DatagramSocketFactory dgs=socketTypeRegister.get(type).getDatagramSocketFactory(); + System.out.println(dgs); + if(dgs==null) { + throw new UnsupportedOperationException("DatagramSocket Unsupported"); + } + DatagramSocket dgd=dgs.createSocket(); + try { + dgd.bind(new InetSocketAddress(host, port)); + }catch(Exception e) { + dgd.close(); + System.gc(); + throw e; + } + return dgd; + } + public DatagramServerSocket listenDatagramServerSocket() throws UnknownHostException, IOException { DatagramServerSocketFactory srf=socketTypeRegister.get(type).getDatagramServerSocketFactory(); if(srf==null) { @@ -430,4 +479,5 @@ public class MultipurposeSocketAddress implements Serializable{ gsonBuilder.registerTypeAdapter(MultipurposeSocketAddress.class, getDefaultJsonDeserializer()); gsonBuilder.registerTypeAdapter(MultipurposeSocketAddress.class, getDefaultJsonSerializer()); } + } diff --git a/src/org/kne/cloud/network/NetworkPacket.java b/src/org/kne/cloud/network/NetworkPacket.java index db1b668..89ca105 100644 --- a/src/org/kne/cloud/network/NetworkPacket.java +++ b/src/org/kne/cloud/network/NetworkPacket.java @@ -50,7 +50,7 @@ public abstract class NetworkPacket implements Comparable{ - public abstract long getLength(); + public abstract long getTotalLength(); public long getPriority() { return priority; diff --git a/src/org/kne/cloud/network/SpeedLimiter.java b/src/org/kne/cloud/network/SpeedLimiter.java index 56d52ba..51d5f32 100644 --- a/src/org/kne/cloud/network/SpeedLimiter.java +++ b/src/org/kne/cloud/network/SpeedLimiter.java @@ -11,7 +11,7 @@ public class SpeedLimiter { return hitlimit; } private volatile long limitspeed=1024*1024; - private long brustTime=1000000L; + private long brustTime=2000000L; private volatile boolean hitlimit=false; public long getLimitspeed() { return limitspeed; @@ -43,7 +43,8 @@ public class SpeedLimiter { private AtomicLong waitingtime=new AtomicLong(); @Override public String toString() { - return "SpeedLimiter [limitspeed=" + limitspeed + "]"; + return "SpeedLimiter [limitspeed=" + limitspeed + ", brustTime=" + brustTime + ", hitlimit=" + hitlimit + + ", ltime=" + ltime + ", waitingtime=" + waitingtime + "]"; } public void forceTransmit(long datasize) { long limitspeedx=limitspeed; @@ -60,7 +61,7 @@ public class SpeedLimiter { } }); - waitingtime.addAndGet(datasize*1000000000L/limitspeedx); + waitingtime.addAndGet((long) (datasize*1000000000.0/limitspeedx)); } } //用系统计时器的时刻相减得到经过的时间,与数据包除以限速值得到的应消耗的时间做对比,若时间还未到达发送下一个数据包的时机,则返回false @@ -83,17 +84,18 @@ public class SpeedLimiter { }); if(nv<=brustTime) { - waitingtime.addAndGet(datasize*1000000000L/limitspeedx); - //System.out.println(limitspeed); return true; }else { return false; } } public void transmit(long datasize) { + long limitspeedx=limitspeed; while(!checkTransmit(datasize)) { - LockSupport.parkNanos(100000); + //LockSupport.parkNanos(100000); + Thread.yield(); } + waitingtime.addAndGet((long) (datasize*1000000000.0/limitspeedx)); } } diff --git a/src/org/kne/cloud/network/VirtualDatagramSocket.java b/src/org/kne/cloud/network/VirtualDatagramSocket.java new file mode 100644 index 0000000..024385e --- /dev/null +++ b/src/org/kne/cloud/network/VirtualDatagramSocket.java @@ -0,0 +1,18 @@ +package org.kne.cloud.network; + +import java.net.DatagramSocket; +import java.net.SocketException; + +public class VirtualDatagramSocket extends DatagramSocket { + private VirtualDatagramSocketImpl virtualImpl; + + protected VirtualDatagramSocketImpl getVirtualImpl() { + return virtualImpl; + } + + public VirtualDatagramSocket(VirtualDatagramSocketImpl si) throws SocketException { + super(si); + this.virtualImpl=si; + } + +} diff --git a/src/org/kne/cloud/network/VirtualDatagramSocketImpl.java b/src/org/kne/cloud/network/VirtualDatagramSocketImpl.java new file mode 100644 index 0000000..ddc1543 --- /dev/null +++ b/src/org/kne/cloud/network/VirtualDatagramSocketImpl.java @@ -0,0 +1,7 @@ +package org.kne.cloud.network; + +import java.net.DatagramSocketImpl; + +public abstract class VirtualDatagramSocketImpl extends DatagramSocketImpl{ + +} diff --git a/src/org/kne/cloud/network/congress/BBRCongressAlgorithm.java b/src/org/kne/cloud/network/congress/BBRCongressAlgorithm.java new file mode 100644 index 0000000..c2a5a02 --- /dev/null +++ b/src/org/kne/cloud/network/congress/BBRCongressAlgorithm.java @@ -0,0 +1,131 @@ +package org.kne.cloud.network.congress; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public class BBRCongressAlgorithm implements CongressAlgorithm { + + private static final long BURST_TIME = 2000000L; + private static final long BIAS = 2000000L; + private static long MIN_SPEED = 128 * 1024L; + private static long MIN_WINDOW = 16384; + + private Consumer windowControlConsumer; + private BiConsumer speedControlConsumer; + + private AtomicBoolean firstUpdate = new AtomicBoolean(true); + private long MIN_RTTVAR = 50000000L; + private volatile long RTTMin = 1000000000L; + private volatile long RTTVar = 1000000000L; + private volatile long RTTAvg = 1000000000L; + private volatile long RTTAvg2 = 1000000000L; + private volatile long RTTTotal = 0; + private volatile long RTTCount = 0; + private volatile long RTO = 1000000000L; + + + private volatile long window=MIN_WINDOW; + private volatile long speed=MIN_SPEED; + private volatile long maxwindow=99999999999L; + private long congressSpeed=MIN_SPEED; + private double MAX_GAIN=1.02;//2.8853900817779 + private double MIN_GAIN=0.9; + private double windowGain=MAX_GAIN; + private double speedGain=MAX_GAIN; + @Override + public void reset() { + window = MIN_WINDOW; + if (windowControlConsumer != null) { + windowControlConsumer.accept(window); + } + speed = MIN_SPEED; + if (speedControlConsumer != null) { + speedControlConsumer.accept(speed, BURST_TIME); + } + windowGain=MAX_GAIN; + } + + @Override + public void setWindowControlConsumer(Consumer windowControlConsumer) { + this.windowControlConsumer = windowControlConsumer; + } + + @Override + public void setSpeedControlConsumer(BiConsumer speedControlConsumer) { + this.speedControlConsumer = speedControlConsumer; + } + + private long RTTstartTime = System.nanoTime(); + private long bandwidth; + @Override + public synchronized void putAck(long packetSize, long latencyns, boolean ecn) { + if (latencyns <= RTTMin) { + RTTMin = latencyns; + } else { + RTTMin = (RTTMin * 99999 + latencyns) / 100000; + } + if (firstUpdate.compareAndSet(true, false)) { + RTTAvg = latencyns; + RTTVar = latencyns / 2; + RTTAvg2 = latencyns; + } else { + RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4; + RTTAvg = (RTTAvg * 7 + latencyns) / 8; + } + RTO = RTTAvg + Math.max(MIN_RTTVAR, RTTVar * 4);// RTTVar*4 + + RTTTotal += latencyns; + RTTCount++; + long curr=System.nanoTime(); + if(curr-RTTstartTime>RTTAvg2) { + if(RTTCount>0) { + RTTAvg2=(RTTAvg2+RTTTotal/RTTCount)/2; + RTTTotal=0; + RTTCount=0; + } + + RTTstartTime=curr; + + if (bandwidth >= congressSpeed) { + congressSpeed = bandwidth; + //congressSpeed = (congressSpeed + bandwidth) / 2; + } else { + congressSpeed = (congressSpeed * 199 + bandwidth) / 200; + } + speed=MIN_SPEED+(long) (congressSpeed * speedGain) ; + window= (Math.max(MIN_SPEED,(long) (congressSpeed*windowGain ))*(RTTMin+1000000L)/1000000000L)+MIN_WINDOW; + if (windowControlConsumer != null) { + windowControlConsumer.accept(window); + } + if (speedControlConsumer != null) { + speedControlConsumer.accept(speed, BURST_TIME); + } + } + + } + + @Override + public void putLoss(long packetSize, long lossns, int losscounter) { + + } + + @Override + public long getRTO() { + return RTO; + } + + @Override + public void setCurrentWindowUsed(long used) { + + } + + @Override + public void setCurrentBandwidth(long bandwidth) { + this.bandwidth=bandwidth; + + //System.out.println(gain); + //System.out.println(bandwidth+" "+congressSpeed+" "+window); + } + +} diff --git a/src/org/kne/cloud/network/congress/BBRVegasCongressAlgorithm.java b/src/org/kne/cloud/network/congress/BBRVegasCongressAlgorithm.java new file mode 100644 index 0000000..ca84762 --- /dev/null +++ b/src/org/kne/cloud/network/congress/BBRVegasCongressAlgorithm.java @@ -0,0 +1,150 @@ +package org.kne.cloud.network.congress; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public class BBRVegasCongressAlgorithm implements CongressAlgorithm { + + private static final long BURST_TIME = 2000000L; + private static final long BIAS = 2000000L; + private static long MIN_SPEED = 128 * 1024L; + private static long MIN_WINDOW = 8192; + + private Consumer windowControlConsumer; + private BiConsumer speedControlConsumer; + + private AtomicBoolean firstUpdate = new AtomicBoolean(true); + private long MIN_RTTVAR = 50000000L; + private volatile long RTTMin = 1000000000L; + private volatile long RTTVar = 1000000000L; + private volatile long RTTAvg = 1000000000L; + private volatile long RTTAvg2 = 1000000000L; + private volatile long RTTTotal = 0; + private volatile long RTTCount = 0; + private volatile long RTO = 1000000000L; + + + private volatile long window=MIN_WINDOW; + private volatile long speed=MIN_SPEED; + private volatile long maxwindow=99999999999L; + private long congressSpeed=MIN_SPEED; + private double MAX_GAIN=2.8853900817779;//2.8853900817779 + private double MIN_GAIN=1.1; + private double gain=MAX_GAIN; + @Override + public void reset() { + window = MIN_WINDOW; + if (windowControlConsumer != null) { + windowControlConsumer.accept(window); + } + speed = MIN_SPEED; + if (speedControlConsumer != null) { + speedControlConsumer.accept(speed, BURST_TIME); + } + gain=MAX_GAIN; + } + + @Override + public void setWindowControlConsumer(Consumer windowControlConsumer) { + this.windowControlConsumer = windowControlConsumer; + } + + @Override + public void setSpeedControlConsumer(BiConsumer speedControlConsumer) { + this.speedControlConsumer = speedControlConsumer; + } + + private long RTTstartTime = System.nanoTime(); + @Override + public synchronized void putAck(long packetSize, long latencyns, boolean ecn) { + if (latencyns <= RTTMin) { + RTTMin = latencyns; + } else { + RTTMin = (RTTMin * 99999 + latencyns) / 100000; + } + if (firstUpdate.compareAndSet(true, false)) { + RTTAvg = latencyns; + RTTVar = latencyns / 2; + RTTAvg2 = latencyns; + } else { + RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4; + RTTAvg = (RTTAvg * 7 + latencyns) / 8; + } + RTO = RTTAvg + Math.max(MIN_RTTVAR, RTTVar * 4);// RTTVar*4 + + RTTTotal += latencyns; + RTTCount++; + long curr=System.nanoTime(); + if(curr-RTTstartTime>RTTMin) { + if(RTTCount>0) { + RTTAvg2=(RTTAvg2+RTTTotal/RTTCount)/2; + RTTTotal=0; + RTTCount=0; + } + long RTTAvg2x=Math.max(RTTAvg2-BIAS,RTTMin); + double excepted=window/(double)RTTMin; + double actual=window/(double)RTTAvg2x; + double diff=(excepted-actual)*RTTMin; + if(diff>65536*3+3) { + gain-=0.0005; + } + if(diff<65536*3+1) { + gain+=0.0005; + } + if(gain>=MAX_GAIN){ + gain=MAX_GAIN; + //System.out.println("window:"+window); + } + if(gain= congressSpeed) { + congressSpeed = (congressSpeed * 49 + bandwidth) / 50; + } else { + congressSpeed = (congressSpeed *2 + bandwidth) / 3; + }*/ + if (bandwidth >= congressSpeed) { + //congressSpeed = bandwidth; + congressSpeed = (congressSpeed + bandwidth) / 2; + } else { + congressSpeed = (congressSpeed * 49 + bandwidth) / 50; + } + speed=Math.max(MIN_SPEED,(long) (congressSpeed * gain)) ; + window=Math.max( (Math.max(MIN_SPEED,(long) (congressSpeed*gain ))*Math.max(2000000L,RTTMin)/1000000000L),MIN_WINDOW); + if (windowControlConsumer != null) { + windowControlConsumer.accept(window); + } + if (speedControlConsumer != null) { + speedControlConsumer.accept(speed, BURST_TIME); + } + //System.out.println(gain); + //System.out.println(bandwidth+" "+congressSpeed+" "+window); + } + +} diff --git a/src/org/kne/cloud/network/congress/CongressAlgorithm.java b/src/org/kne/cloud/network/congress/CongressAlgorithm.java new file mode 100644 index 0000000..8156cc1 --- /dev/null +++ b/src/org/kne/cloud/network/congress/CongressAlgorithm.java @@ -0,0 +1,16 @@ +package org.kne.cloud.network.congress; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public interface CongressAlgorithm { + public void reset(); + public void setWindowControlConsumer(ConsumerwindowControlConsumer); + public void setSpeedControlConsumer(BiConsumerspeedControlConsumer); + public void putAck(long packetSize,long latencyns,boolean ecn); + public void putLoss(long packetSize,long lossns,int losscounter); + public void setCurrentWindowUsed(long maxwindow); + public void setCurrentBandwidth(long bandwidth); + public long getRTO(); + +} diff --git a/src/org/kne/cloud/network/congress/ECNCongressAlgorithm.java b/src/org/kne/cloud/network/congress/ECNCongressAlgorithm.java new file mode 100644 index 0000000..441a17e --- /dev/null +++ b/src/org/kne/cloud/network/congress/ECNCongressAlgorithm.java @@ -0,0 +1,170 @@ +package org.kne.cloud.network.congress; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public class ECNCongressAlgorithm implements CongressAlgorithm { + + private static final long BURST_TIME = 2000000L; + private static final long BIAS = 2000000L; + private static long MIN_SPEED = 64 * 1024L; + private static long MIN_WINDOW = 16384; + + private Consumer windowControlConsumer; + private BiConsumer speedControlConsumer; + + private AtomicBoolean firstUpdate = new AtomicBoolean(true); + private long MIN_RTTVAR = 50000000L; + private volatile long RTTMin = 1000000000L; + private volatile long RTTVar = 1000000000L; + private volatile long RTTAvg = 1000000000L; + private volatile long RTTAvg2 = 1000000000L; + private double ECNAvg2 = 0L; + private double alpha=0; + private volatile AtomicLong RTTTotal = new AtomicLong(0); + private volatile AtomicLong ECNSize = new AtomicLong(0); + private volatile AtomicLong TotalSize = new AtomicLong(0); + private volatile AtomicLong RTTCount = new AtomicLong(0); + private volatile long RTO = 1000000000L; + + + private volatile long window=MIN_WINDOW; + private volatile long windowUsed=MIN_WINDOW; + private volatile long congressWindowSize=MIN_WINDOW; + private volatile long speed=MIN_SPEED; + private long congressSpeed=MIN_SPEED; + + private long RTTstartTime = System.nanoTime(); + private long bandwidth=MIN_SPEED; + private double MAX_GAIN=1.2;//2.8853900817779 + private double MIN_GAIN=1.2; + private double gain=MAX_GAIN; + + private ReentrantLock lock=new ReentrantLock(); + @Override + public void reset() { + window = MIN_WINDOW; + if (windowControlConsumer != null) { + windowControlConsumer.accept(window); + } + speed = MIN_SPEED; + if (speedControlConsumer != null) { + speedControlConsumer.accept(speed, BURST_TIME); + } + gain=MAX_GAIN; + } + + @Override + public void setWindowControlConsumer(Consumer windowControlConsumer) { + this.windowControlConsumer = windowControlConsumer; + } + + @Override + public void setSpeedControlConsumer(BiConsumer speedControlConsumer) { + this.speedControlConsumer = speedControlConsumer; + } + + @Override + public synchronized void putAck(long packetSize, long latencyns, boolean ecn) { + if (latencyns <= RTTMin) { + RTTMin = latencyns; + } else { + RTTMin = (RTTMin * 99999 + latencyns) / 100000; + } + if (firstUpdate.compareAndSet(true, false)) { + RTTAvg = latencyns; + RTTVar = latencyns / 2; + RTTAvg2 = latencyns; + } else { + RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4; + RTTAvg = (RTTAvg * 7 + latencyns) / 8; + } + RTO = RTTAvg + Math.max(MIN_RTTVAR, RTTVar * 4);// RTTVar*4 + + RTTTotal .addAndGet( latencyns); + if(ecn) { + ECNSize.addAndGet(packetSize); + } + TotalSize.addAndGet(packetSize); + RTTCount.incrementAndGet(); + + + long curr=System.nanoTime(); + if(curr-RTTstartTime>RTTAvg2) { + RTTstartTime=curr; + lock.lock(); + try { + if(RTTCount.get()>0) { + long count=RTTCount.getAndSet(0); + RTTAvg2=RTTTotal.getAndSet(0)/count; + ECNAvg2=ECNSize.getAndSet(0)/(double)TotalSize.getAndSet(0); + alpha=(alpha*15+ECNAvg2)/16; + //System.out.println(alpha); + } + if(ECNAvg2>0.5) { + gain=MIN_GAIN; + if(congressWindowSize>MIN_WINDOW) { + congressWindowSize=Math.max(MIN_WINDOW,(long) (congressWindowSize*(1-alpha/5))); + updateWindowSize(); + } + }else if(ECNAvg2>0.05){ + if(windowUsed*3L>=congressWindowSize) { + congressWindowSize+=100; + updateWindowSize(); + } + }else { + if(windowUsed*3L>=congressWindowSize) { + congressWindowSize+=4000; + updateWindowSize(); + } + } + + if (bandwidth >= congressSpeed) { + congressSpeed = bandwidth; + } else { + congressSpeed = (congressSpeed * 99 + bandwidth) / 100; + } + speed=Math.max(MIN_SPEED,(long) (congressSpeed * gain)) ; + + if (speedControlConsumer != null) { + speedControlConsumer.accept(speed, BURST_TIME); + } + }finally { + lock.unlock(); + } + } + //System.out.println(speed+" "+window); + + } + + private void updateWindowSize() { + window=Math.max( congressWindowSize,MIN_WINDOW); + if (windowControlConsumer != null) { + windowControlConsumer.accept(window); + } + } + + @Override + public void putLoss(long packetSize, long lossns, int losscounter) { + + } + + @Override + public long getRTO() { + return RTO; + } + + @Override + public void setCurrentWindowUsed(long used) { + this.windowUsed=used; + } + + @Override + public void setCurrentBandwidth(long bandwidth) { + this.bandwidth=bandwidth; + } + +} diff --git a/src/org/kne/cloud/network/congress/EmptyCongressAlgorithm.java b/src/org/kne/cloud/network/congress/EmptyCongressAlgorithm.java new file mode 100644 index 0000000..a346351 --- /dev/null +++ b/src/org/kne/cloud/network/congress/EmptyCongressAlgorithm.java @@ -0,0 +1,66 @@ +package org.kne.cloud.network.congress; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public class EmptyCongressAlgorithm implements CongressAlgorithm{ + + private long timeout; + + @Override + public void reset() { + // TODO 自动生成的方法存根 + + } + + public long getTimeout() { + return timeout; + } + + @Override + public void setWindowControlConsumer(Consumer windowControlConsumer) { + // TODO 自动生成的方法存根 + + } + + @Override + public void setSpeedControlConsumer(BiConsumer speedControlConsumer) { + // TODO 自动生成的方法存根 + + } + + @Override + public void putAck(long packetSize, long latencyns, boolean ecn) { + // TODO 自动生成的方法存根 + + } + + @Override + public void putLoss(long packetSize, long lossns, int losscounter) { + // TODO 自动生成的方法存根 + + } + + @Override + public void setCurrentWindowUsed(long maxwindow) { + // TODO 自动生成的方法存根 + + } + + @Override + public void setCurrentBandwidth(long bandwidth) { + // TODO 自动生成的方法存根 + + } + + public EmptyCongressAlgorithm(long timeout) { + super(); + this.timeout = timeout; + } + + @Override + public long getRTO() { + return timeout; + } + +} diff --git a/src/org/kne/cloud/network/congress/LARCCongressAlgorithm.java b/src/org/kne/cloud/network/congress/LARCCongressAlgorithm.java new file mode 100644 index 0000000..5269b6b --- /dev/null +++ b/src/org/kne/cloud/network/congress/LARCCongressAlgorithm.java @@ -0,0 +1,138 @@ +package org.kne.cloud.network.congress; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public class LARCCongressAlgorithm implements CongressAlgorithm { + + private static final long BURST_TIME = 1000000L; + private static final long BIAS = 1000000L; + private static long MIN_SPEED = 64 * 1024L; + private static long MIN_WINDOW = 16384; + + private Consumer windowControlConsumer; + private BiConsumer speedControlConsumer; + + private AtomicBoolean firstUpdate = new AtomicBoolean(true); + private long MIN_RTTVAR = 10000000L; + private volatile long RTTMin = 1000000000L; + private volatile long RTTVar = 1000000000L; + private volatile long RTTAvg = 1000000000L; + private volatile long RTTAvg2 = 1000000000L; + private volatile long RTTTotal = 0; + private volatile long RTTCount = 0; + private volatile long RTO = 1000000000L; + + + private volatile long window=MIN_WINDOW; + private volatile long speed=MIN_SPEED; + private volatile long maxwindow=99999999999L; + private long congressSpeed=MIN_SPEED; + private double MAX_GAIN=1.1;//2.8853900817779 + private double MIN_GAIN=0.95; + private double windowGain=1.5; + private double speedGain=4;//MAX_GAIN + @Override + public void reset() { + window = MIN_WINDOW; + if (windowControlConsumer != null) { + windowControlConsumer.accept(window); + } + speed = MIN_SPEED; + if (speedControlConsumer != null) { + speedControlConsumer.accept(speed, BURST_TIME); + } + windowGain=MAX_GAIN; + } + + @Override + public void setWindowControlConsumer(Consumer windowControlConsumer) { + this.windowControlConsumer = windowControlConsumer; + } + + @Override + public void setSpeedControlConsumer(BiConsumer speedControlConsumer) { + this.speedControlConsumer = speedControlConsumer; + } + + private long RTTstartTime = System.nanoTime(); + private long bandwidth; + @Override + public synchronized void putAck(long packetSize, long latencyns, boolean ecn) { + if (latencyns <= RTTMin) { + RTTMin = latencyns; + } else { + RTTMin = (RTTMin * 99999 + latencyns) / 100000; + } + if (firstUpdate.compareAndSet(true, false)) { + RTTAvg = latencyns; + RTTVar = latencyns / 2; + RTTAvg2 = latencyns; + } else { + RTTVar = (RTTVar * 3 + Math.abs(RTTAvg - latencyns)) / 4; + RTTAvg = (RTTAvg * 7 + latencyns) / 8; + } + RTO = RTTAvg + Math.max(MIN_RTTVAR, RTTVar * 4);// RTTVar*4 + + RTTTotal += latencyns; + RTTCount++; + /*double rate=latencyns/(double)(RTTMin+BIAS); + if(rate>2) { + windowGain=MIN_GAIN; + }else if(rate<1.2){ + windowGain=MAX_GAIN; + + }*/ + long curr=System.nanoTime(); + if(curr-RTTstartTime>RTTAvg2) { + if(RTTCount>0) { + RTTAvg2=(RTTAvg2+RTTTotal/RTTCount)/2; + RTTTotal=0; + RTTCount=0; + } + + RTTstartTime=curr; + + if (bandwidth >= congressSpeed) { + congressSpeed = bandwidth; + //congressSpeed = (congressSpeed + bandwidth) / 2; + } else { + congressSpeed = (congressSpeed * 199 + bandwidth) / 200; + } + speed=(long) (congressSpeed * speedGain)+MIN_SPEED ; + window= ((long) (congressSpeed*windowGain )*(RTTMin+BIAS)/1000000000L)+MIN_WINDOW; + if (windowControlConsumer != null) { + windowControlConsumer.accept(window); + } + if (speedControlConsumer != null) { + speedControlConsumer.accept(speed, BURST_TIME); + } + } + + } + + @Override + public void putLoss(long packetSize, long lossns, int losscounter) { + + } + + @Override + public long getRTO() { + return RTO; + } + + @Override + public void setCurrentWindowUsed(long used) { + + } + + @Override + public void setCurrentBandwidth(long bandwidth) { + this.bandwidth=bandwidth; + + //System.out.println(gain); + //System.out.println(bandwidth+" "+congressSpeed+" "+window); + } + +} diff --git a/src/org/kne/cloud/network/congress/MessageBatcher.java b/src/org/kne/cloud/network/congress/MessageBatcher.java new file mode 100644 index 0000000..274438b --- /dev/null +++ b/src/org/kne/cloud/network/congress/MessageBatcher.java @@ -0,0 +1,190 @@ +package org.kne.cloud.network.congress; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.LockSupport; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; + +/** + * 网络消息批量发送器,用于减少小包数量,降低网络性能开销 + * @param 消息类型 + */ +public class MessageBatcher implements Runnable{ + private ArrayList messageList; + private ReentrantLock lock=new ReentrantLock(); + private final int batchSize; + private final long maxDelay; + private Consumer> consumer; + private final Thread batchThread; + private final AtomicBoolean running; + private long firstTime; + + /** + * 构造函数 + * @param batchSize 批量大小,当消息达到此数量时触发发送 + * @param maxDelayMillis 最大延迟时间(毫秒),即使消息数量不足也会触发发送 + */ + public MessageBatcher(int batchSize, long maxDelay) { + this.batchSize = batchSize; + this.maxDelay = maxDelay; + this.running = new AtomicBoolean(true); + + // 创建并启动批量处理线程 + this.batchThread = new Thread(this); + this.batchThread.setDaemon(true); + this.batchThread.start(); + } + + /** + * 设置消息消费者回调函数 + * @param consumer 消费者回调 + */ + public void setConsumer(Consumer> consumer) { + this.consumer = consumer; + } + + /** + * 添加消息到批量处理器 + * @param message 消息对象 + */ + public void putMessage(T message) { + if (message != null) { + lock.lock(); + try { + if(messageList==null) { + messageList=new ArrayList(batchSize); + firstTime=System.nanoTime(); + } + messageList.add(message); + check(false); + }finally { + lock.unlock(); + } + } + } + + + /** + * 批量添加消息 + * @param messages 消息列表 + */ + public void putMessages(List messages) { + for(T message :messages) { + putMessage(message); + } + } + + + private void check(boolean force) { + if(messageList==null) + return; + long currTime=System.nanoTime(); + if(messageList.size()>=batchSize||(currTime-firstTime)>maxDelay||force) { + if(consumer!=null) { + try { + consumer.accept(messageList); + }catch(Exception e) { + e.printStackTrace(); + } + } + messageList=null; + } + } + + /** + * 停止批量处理器 + */ + public void close() { + running.set(false); + LockSupport.unpark(batchThread); + // 确保所有消息都被发送 + flush(); + } + + /** + * 批量处理消息的核心方法 + */ + public void run() { + while(running.get()) { + lock.lock(); + try { + check(false); + }finally { + lock.unlock(); + } + // 更精确的等待策略 + long sleepTimeNanos = calculateSleepTime(); + if (sleepTimeNanos > 0) { + LockSupport.parkNanos(sleepTimeNanos); + } else { + // 避免忙等待 + LockSupport.parkNanos(1_000_000L); // 1ms + } + } + } + + /** + * 计算需要等待的时间 + * @return 等待时间(纳秒) + */ + private long calculateSleepTime() { + lock.lock(); + try { + if (messageList == null || messageList.isEmpty()) { + return 10_000_000L; // 10ms + } + + long elapsed = System.nanoTime() - firstTime; + long remaining = maxDelay - elapsed; + + if (remaining <= 0) { + return 0; // 立即处理 + } + + // 返回剩余时间或10ms中的较小值 + return Math.min(remaining, 10_000_000L); + } finally { + lock.unlock(); + } + } + + public int getBatchSize() { + return batchSize; + } + + public long getMaxDelay() { + return maxDelay; + } + + public void flush() { + lock.lock(); + try { + check(true); + }finally { + lock.unlock(); + } + } + + public int getQueueSize() { + List cmessageList =messageList; + if(cmessageList==null) + return 0; + return cmessageList.size(); + } + public static void main(String[] args) throws InterruptedException { + MessageBatchermes=new MessageBatcher<>(10, 1000000L); + mes.setConsumer((x)->{System.out.println(x);}); + int n=0; + for(;;){ + mes.putMessage(n++); + mes.putMessage(n++); + mes.putMessage(n++); + mes.putMessage(n++); + Thread.sleep(1); + } + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/klalb/ReceiveSlidingWindow.java b/src/org/kne/cloud/network/congress/ReceiveByteSlidingWindow.java similarity index 85% rename from src/org/kne/cloud/network/klalb/ReceiveSlidingWindow.java rename to src/org/kne/cloud/network/congress/ReceiveByteSlidingWindow.java index 59bb764..ccb793a 100644 --- a/src/org/kne/cloud/network/klalb/ReceiveSlidingWindow.java +++ b/src/org/kne/cloud/network/congress/ReceiveByteSlidingWindow.java @@ -1,11 +1,11 @@ -package org.kne.cloud.network.klalb; +package org.kne.cloud.network.congress; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReferenceArray; -public class ReceiveSlidingWindow { +public class ReceiveByteSlidingWindow { private AtomicReferenceArray array; private AtomicInteger windowSize =new AtomicInteger(); private AtomicLong windowPosition=new AtomicLong(); @@ -26,7 +26,7 @@ public class ReceiveSlidingWindow { this.windowPosition.set(windowPosition); } - public ReceiveSlidingWindow(int capacity){ + public ReceiveByteSlidingWindow(int capacity){ array=new AtomicReferenceArray(capacity); } diff --git a/src/org/kne/cloud/network/klalb/SendSlidingWindow.java b/src/org/kne/cloud/network/congress/SendByteSlidingWindow.java similarity index 88% rename from src/org/kne/cloud/network/klalb/SendSlidingWindow.java rename to src/org/kne/cloud/network/congress/SendByteSlidingWindow.java index 6595164..0f56e50 100644 --- a/src/org/kne/cloud/network/klalb/SendSlidingWindow.java +++ b/src/org/kne/cloud/network/congress/SendByteSlidingWindow.java @@ -1,4 +1,4 @@ -package org.kne.cloud.network.klalb; +package org.kne.cloud.network.congress; import java.util.Iterator; import java.util.Objects; @@ -6,7 +6,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReferenceArray; -public class SendSlidingWindow implements Iterable{ +public class SendByteSlidingWindow implements Iterable{ private Object[] array; private volatile int windowSize ; private volatile long windowPosition; @@ -27,7 +27,7 @@ public class SendSlidingWindow implements Iterable{ this.windowPosition=windowPosition; } - public SendSlidingWindow(int capacity,int windowSize){ + public SendByteSlidingWindow(int capacity,int windowSize){ if(windowSize>capacity) { throw new IllegalArgumentException("windowSize>capacity!"); } diff --git a/src/org/kne/cloud/network/congress/SendPacketSlidingWindow.java b/src/org/kne/cloud/network/congress/SendPacketSlidingWindow.java new file mode 100644 index 0000000..ade50ab --- /dev/null +++ b/src/org/kne/cloud/network/congress/SendPacketSlidingWindow.java @@ -0,0 +1,203 @@ +package org.kne.cloud.network.congress; + +import java.io.Closeable; +import java.io.IOException; +import java.net.SocketException; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.UUID; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.function.Consumer; + +import org.kne.cloud.network.NetworkPacket; +import org.kne.cloud.network.ipv6.IPv6Packet; +import org.kne.cloud.network.klalb.SendItem; + +public class SendPacketSlidingWindow implements Closeable,AutoCloseable{ + private Map> sendMap= new ConcurrentHashMap<>(1024,0.2f); + //private AtomicInteger sendmapWindowUsed=new AtomicInteger(0); + private LongAdder sendmapWindowUsed=new LongAdder(); + + private int headerCalibrate=0; + public void setHeaderCalibrate(int headerCalibrate) { + this.headerCalibrate = headerCalibrate; + } + + private CongressAlgorithm algorithm; + + private Consumer resendConsumer; + private Consumer closingConsumer; + private volatile boolean closed=false; + private ResendChecker checker=new ResendChecker(); + private AtomicLong windowSize = new AtomicLong(); + + + private Lock lock; + + private Condition condition; + + public SendPacketSlidingWindow(CongressAlgorithm algorithm, long windowSize) { + super(); + this.algorithm = algorithm; + this.windowSize .set( windowSize); + Thread t=new Thread(checker); + t.start(); + } + + public SendPacketSlidingWindow(CongressAlgorithm algorithm, long windowSize,int headerCalibrate) { + this(algorithm,windowSize); + this.headerCalibrate=headerCalibrate; + } + + public long getWindowSize() { + return windowSize.get(); + } + + public void setWindowSize(long windowSize) { + this.windowSize.set(windowSize); + } + + public Consumer getResendConsumer() { + return resendConsumer; + } + + public void setResendConsumer(Consumer resendConsumer) { + this.resendConsumer = resendConsumer; + } + + public Consumer getClosingConsumer() { + return closingConsumer; + } + + public void setClosingConsumer(Consumer closingConsumer) { + this.closingConsumer = closingConsumer; + } + + public long getSendmapWindowUsed() { + return sendmapWindowUsed.sum(); + } + + public int getHeaderCalibrate() { + return headerCalibrate; + } + + public CongressAlgorithm getAlgorithm() { + return algorithm; + } + + + public boolean isCongress(IPv6Packet iPv6Packet,double scale) { + boolean congress=sendmapWindowUsed.sum()>windowSize.get()*scale; + return congress; + + } + + public void put(K sequence,V packet) throws SocketException { + if(closed) { + throw new SocketException("sliding window closed!"); + } + SendItem newitem=new SendItem( packet); + SendItem old= sendMap.put(sequence,newitem); + if(old!=null) { + sendmapWindowUsed.add( -(old.getPacketLength()+headerCalibrate)); + } + sendmapWindowUsed.add( (newitem.getPacketLength()+headerCalibrate)); + long newWindow=sendmapWindowUsed.sum(); + algorithm.setCurrentWindowUsed(newWindow); + } + + public V ack(K sequence) { + SendItem ipv6; + if((ipv6=sendMap.remove(sequence))!=null) { + sendmapWindowUsed.add( -(ipv6.getPacketLength()+headerCalibrate)); + long newWindow= sendmapWindowUsed.sum(); + algorithm.setCurrentWindowUsed(newWindow); + long RTTC=System.nanoTime()-ipv6.getSendtime(); + algorithm.putAck(ipv6.getPacketLength(), RTTC, false); + //System.out.println("remove:"+aseq.getSequence()+" "+sendMap.size()); + Lock lockx=lock; + if(lockx!=null) { + lockx.lock(); + try { + Condition cds=condition; + if(cds!=null) { + cds.signalAll(); + } + }finally { + lockx.unlock(); + } + } + return ipv6.getPacket(); + }else { + // System.out.println("miss:"+aseq.getSequence()+" "+sendMap.size()); + return null; + } + } + + private class ResendChecker implements Runnable{ + + @Override + public void run() { + while(!closed) { + + Collection>vals= sendMap.values(); + for (Iterator> iterator = vals.iterator(); iterator.hasNext();) { + SendItem sitm = (SendItem) iterator.next(); + if(System.nanoTime() -sitm.getSendtime()>algorithm.getRTO()) { + iterator.remove(); + sendmapWindowUsed.add((int) -(sitm.getPacketLength()+headerCalibrate)); + long newWindow=sendmapWindowUsed.sum(); + algorithm.setCurrentWindowUsed(newWindow); + //if(!kplink.isStream()) + V pktr=sitm.getPacket(); + pktr.setPriority(pktr.getPriority()-1); + if(resendConsumer!=null) + resendConsumer.accept(pktr); + //System.out.println("reroute"); + } + } + + + + try { + Thread.sleep(2); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + // 清理资源 + if (closingConsumer != null) { + for (SendItem item : sendMap.values()) { + closingConsumer.accept(item.getPacket()); + } + } + sendMap.clear(); + sendmapWindowUsed.reset(); + } + } + public boolean isClosed() { + return closed; + } + + @Override + public void close() { + closed=true; + } + + public void setCongressCondition(Lock lock2, Condition condition2) { + this.lock=lock2; + this.condition=condition2; + } + + public Map> getSendmap() { + return sendMap; + } + +} diff --git a/src/org/kne/cloud/network/congress/VegasCongressAlgorithm.java b/src/org/kne/cloud/network/congress/VegasCongressAlgorithm.java new file mode 100644 index 0000000..7227c65 --- /dev/null +++ b/src/org/kne/cloud/network/congress/VegasCongressAlgorithm.java @@ -0,0 +1,132 @@ +package org.kne.cloud.network.congress; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public class VegasCongressAlgorithm implements CongressAlgorithm { + + private static final long BURST_TIME = 1000000L; + private static final long BIAS = 1000000L; + private static long MIN_SPEED=256*1024L; + private static long MIN_WINDOW=4096L; + + private Consumer windowControlConsumer; + private BiConsumer speedControlConsumer; + + private AtomicBoolean firstUpdate=new AtomicBoolean(true); + private long MIN_RTTVAR=30000000L; + private volatile long RTTMin=1000000000L; + private volatile long RTTVar=1000000000L; + private volatile long RTTAvg=1000000000L; + private volatile long RTTAvg2=1000000000L; + private volatile long RTTTotal=0; + private volatile long RTTCount=0; + private volatile long RTO=1000000000L; + + private volatile long window=MIN_WINDOW; + private volatile long speed=MIN_SPEED; + private volatile long maxwindow=99999999999L; + @Override + public void reset() { + window=MIN_WINDOW; + if(windowControlConsumer!=null) { + windowControlConsumer.accept(window); + } + speed=MIN_SPEED; + if(speedControlConsumer!=null) { + speedControlConsumer.accept(speed, BURST_TIME); + } + } + + @Override + public void setWindowControlConsumer(Consumer windowControlConsumer) { + this.windowControlConsumer=windowControlConsumer; + } + + @Override + public void setSpeedControlConsumer(BiConsumer speedControlConsumer) { + this.speedControlConsumer=speedControlConsumer; + } + private long RTTstartTime=System.nanoTime(); + @Override + public synchronized void putAck(long packetSize, long latencyns, boolean ecn) { + if(latencyns<=RTTMin) { + RTTMin=latencyns; + }else { + RTTMin= (RTTMin*9999+latencyns)/10000; + } + if(firstUpdate.compareAndSet(true, false)) { + RTTAvg=latencyns; + RTTVar=latencyns/2; + RTTAvg2=latencyns; + }else { + RTTVar=(RTTVar*3+Math.abs(RTTAvg-latencyns))/4; + RTTAvg= (RTTAvg*7+latencyns)/8; + } + RTO=RTTAvg+Math.max(MIN_RTTVAR, RTTVar*4);//RTTVar*4 + + RTTTotal+=latencyns; + RTTCount++; + + long curr=System.nanoTime(); + if(curr-RTTstartTime>RTTMin) { + if(RTTCount>0) { + RTTAvg2=(RTTAvg2+RTTTotal/RTTCount)/2; + RTTTotal=0; + RTTCount=0; + } + double excepted=window/(double)(Math.max( BIAS,RTTMin)); + double actual=window/(double)(RTTAvg2); + double diff=(excepted-actual)*(Math.max( BIAS,RTTMin)); + //System.out.println("diff:"+diff); + if(diff>65536*3) { + window-=512; + } + if(diff<65536*2) { + window+=512; + } + if(window>=maxwindow){ + window=maxwindow; + //System.out.println("window:"+window); + } + if(window listeners = new CopyOnWriteArraySet<>(); + + @Override + public void addIPv6LinkStateListener(IPv6LinkStateListener listener) { + listeners.add(listener); + } + + @Override + public void removeIPv6LinkStateListener(IPv6LinkStateListener listener) { + listeners.remove(listener); + + } + + public void onOnlineStateUpdate() { + listeners.forEach((v) -> { + v.onOnlineStateUpdate(this); + }); + } + public void onLocatorUpdate() { + listeners.forEach((v) -> { + v.onLocatorUpdate(this); + }); + } + + public void onAddressUpdate() { + listeners.forEach((v) -> { + v.onAddressUpdate(this); + }); + } +} diff --git a/src/org/kne/cloud/network/ipv6/ICMPv6EchoPacket.java b/src/org/kne/cloud/network/ipv6/ICMPv6EchoPacket.java new file mode 100644 index 0000000..2d3de03 --- /dev/null +++ b/src/org/kne/cloud/network/ipv6/ICMPv6EchoPacket.java @@ -0,0 +1,85 @@ +package org.kne.cloud.network.ipv6; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; + +import org.kne.cloud.network.NetworkPacket; +import org.kne.cloud.network.ipv6.IPv6Packet; +import org.kne.io.KNEChannels; + +public class ICMPv6EchoPacket extends ICMPv6Packet { + private static final int ECHO_HEADER_LENGTH = 4; // 标识符(2) + 序列号(2) + + public ICMPv6EchoPacket(boolean isRequest,int sequenceNumber,int identifier) { + super(isRequest ? TYPE_ECHO_REQUEST : TYPE_ECHO_REPLY, 0); + setSequenceNumber(sequenceNumber); + setIdentifier(identifier); + } + + + /** + * 获取标识符 + */ + public int getIdentifier() { + return getHeader().getChar(4); + } + + /** + * 设置标识符 + */ + public void setIdentifier(int identifier) { + getHeader().putChar(4, (char) identifier); + } + + /** + * 获取序列号 + */ + public int getSequenceNumber() { + return getHeader().getChar(6); + } + + /** + * 设置序列号 + */ + public void setSequenceNumber(int sequenceNumber) { + getHeader().putChar(6, (char) sequenceNumber); + } + + + /** + * 创建Ping请求包 + */ + public static ICMPv6EchoPacket createPingRequest(int identifier, int sequenceNumber, byte[] payload) { + ICMPv6EchoPacket packet = new ICMPv6EchoPacket(true,identifier,sequenceNumber); + if (payload != null && payload.length > 0) { + packet.getData().put(payload); + packet.getData().flip(); + } + return packet; + } + + /** + * 创建Ping回复包(基于请求包) + */ + public static ICMPv6EchoPacket createPingReply(ICMPv6EchoPacket request) { + ICMPv6EchoPacket reply = new ICMPv6EchoPacket(false,request.getIdentifier(),request.getSequenceNumber()); + // 复制数据 + if (request.getData() != null && request.getData().limit() > 0) { + ByteBuffer src = request.getData().duplicate(); + src.position(0); + reply.getData().put(src); + reply.getData().flip(); + } + + return reply; + } + + @Override + public String toString() { + String typeStr = getType() == TYPE_ECHO_REQUEST ? "Echo Request" : "Echo Reply"; + return String.format("ICMPv6 %s [ID:%d, Seq:%d, Data:%d bytes]", + typeStr, getIdentifier(), getSequenceNumber(), getDataLength()); + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ipv6/ICMPv6Packet.java b/src/org/kne/cloud/network/ipv6/ICMPv6Packet.java new file mode 100644 index 0000000..9ea27f4 --- /dev/null +++ b/src/org/kne/cloud/network/ipv6/ICMPv6Packet.java @@ -0,0 +1,284 @@ +package org.kne.cloud.network.ipv6; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.util.Arrays; + +import org.kne.cloud.network.NetworkPacket; +import org.kne.cloud.network.ipv6.IPv6Packet; +import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload; +import org.kne.io.KNEChannels; + +public class ICMPv6Packet extends IPv6Payload { + public static final int ICMPv6_PROTOCOL_NUMBER = 58; + public static final int ICMPv6_HEADER_LENGTH = 8; // ICMPv6基础头部固定8字节 + + // ICMPv6类型常量 + public static final int TYPE_DESTINATION_UNREACHABLE = 1; + public static final int TYPE_PACKET_TOO_BIG = 2; + public static final int TYPE_TIME_EXCEEDED = 3; + public static final int TYPE_PARAMETER_PROBLEM = 4; + public static final int TYPE_ECHO_REQUEST = 128; + public static final int TYPE_ECHO_REPLY = 129; + + private ByteBuffer header = NetworkPacket.bufferAllocator.allocate(ICMPv6_HEADER_LENGTH); + private ByteBuffer data; + + public ICMPv6Packet() { + super(ICMPv6_PROTOCOL_NUMBER, false); + } + + public ICMPv6Packet(int type, int code) { + super(ICMPv6_PROTOCOL_NUMBER, false); + getHeader().put((byte) type); + getHeader().put((byte) code); + // 校验和字段初始为0,后续计算 + getHeader().putChar((char) 0); + data = NetworkPacket.bufferAllocator.allocate(65535); + } + + @Override + public long getTotalLength() { + return data != null ? data.limit() + ICMPv6_HEADER_LENGTH : ICMPv6_HEADER_LENGTH; + } + + + + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + // 写入头部和数据 + dto.write(getHeader().slice(0, ICMPv6_HEADER_LENGTH)); + if (data != null && data.limit() > 0) { + dto.write(data.slice(0, data.limit())); + } + } + + @Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + // 读取ICMPv6头部 + getHeader().clear().limit(ICMPv6_HEADER_LENGTH); + KNEChannels.readFully(din, getHeader()); + + // 读取数据部分(总长度减去头部长度) + long dataLength = length - ICMPv6_HEADER_LENGTH; + + if (dataLength < 0) { + throw new IOException("Invalid ICMPv6 packet: total length < header length"); + } + + if (dataLength > 0) { + data = NetworkPacket.bufferAllocator.allocate((int) dataLength); + KNEChannels.readFully(din, data); + data.flip(); + } else { + data = null; + } + } + + @Override + protected boolean needEndPosition() { + return false; + } + + /** + * 获取ICMPv6类型 + */ + public int getType() { + return getHeader().get(0) & 0xFF; + } + + /** + * 设置ICMPv6类型 + */ + public void setType(int type) { + getHeader().put(0, (byte) type); + } + + /** + * 获取ICMPv6代码 + */ + public int getCode() { + return getHeader().get(1) & 0xFF; + } + + /** + * 设置ICMPv6代码 + */ + public void setCode(int code) { + getHeader().put(1, (byte) code); + } + + /** + * 获取校验和 + */ + public int getChecksum() { + return getHeader().getChar(2); + } + + /** + * 设置校验和 + */ + public void setChecksum(int checksum) { + getHeader().putChar(2, (char) checksum); + } + + /** + * 获取消息体(不同类型ICMPv6消息的特定字段) + * 对于Echo请求/回复,这是标识符和序列号 + * 对于错误消息,这是未使用的字段和原始数据包片段 + */ + public int getMessageBody() { + return getHeader().getInt(4); + } + + /** + * 设置消息体 + */ + public void setMessageBody(int messageBody) { + getHeader().putInt(4, messageBody); + } + + /** + * 获取数据部分长度 + */ + public int getDataLength() { + return data != null ? data.limit() : 0; + } + + public ByteBuffer getData() { + return data; + } + + /** + * 计算ICMPv6校验和 + * ICMPv6校验和计算包括IPv6伪首部和整个ICMPv6报文 + */ + public int calculateChecksum() { + if (getParent() == null) { + throw new IllegalStateException("Parent IPv6 packet required for checksum calculation"); + } + + // 保存原始校验和值 + int originalChecksum = getChecksum(); + + try { + // 临时将校验和字段设为0 + setChecksum(0); + + long sum = 0; + + // IPv6伪首部 + byte[] srcAddr = new byte[16], dstAddr = new byte[16]; + getParent().getRawSourceAddress(srcAddr); + getParent().getRawDestinationAddress(dstAddr); + + for (int i = 0; i < 16; i += 2) { + sum += ((srcAddr[i] & 0xFF) << 8) | (srcAddr[i + 1] & 0xFF); + sum += ((dstAddr[i] & 0xFF) << 8) | (dstAddr[i + 1] & 0xFF); + } + + // ICMPv6报文长度 + int totalLength = (int) getTotalLength(); + sum += (totalLength >>> 16) + totalLength; + sum += ICMPv6_PROTOCOL_NUMBER; + + // ICMPv6头部 + ByteBuffer headerCopy = getHeader().duplicate(); + headerCopy.position(0).limit(ICMPv6_HEADER_LENGTH); + while (headerCopy.remaining() >= 2) { + sum += headerCopy.getChar(); + } + + // ICMPv6数据 + if (data != null && data.limit() > 0) { + ByteBuffer dataCopy = data.duplicate(); + dataCopy.position(0); + + while (dataCopy.remaining() >= 2) { + sum += dataCopy.getChar(); + } + + if (dataCopy.remaining() == 1) { + sum += (dataCopy.get() & 0xFF) << 8; + } + } + + // 折叠进位并取反 + while ((sum >> 16) != 0) { + sum = (sum & 0xFFFF) + (sum >> 16); + } + + int checksum = (int) (~sum & 0xFFFF); + return checksum == 0 ? 0xFFFF : checksum; + + } finally { + // 恢复原始校验和值 + setChecksum(originalChecksum); + } + } + + /** + * 更新校验和 + */ + public void updateChecksum() { + setChecksum(calculateChecksum()); + } + + /** + * 验证校验和 + */ + public boolean verifyChecksum() { + int storedChecksum = getChecksum(); + return storedChecksum == 0 || storedChecksum == calculateChecksum(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("ICMPv6 Type:").append(getType()) + .append(" Code:").append(getCode()) + .append(" [Total:").append(getTotalLength()) + .append(", Data:").append(getDataLength()).append("]"); + + if (data != null && data.limit() > 0) { + byte[] b = new byte[Math.min(data.limit(), 10)]; + data.get(0, b); + sb.append(" ").append(Arrays.toString(b)); + } + + return sb.toString(); + } + + + // 测试方法 + public static void main(String[] args) { + // 创建一个Echo Request类型的ICMPv6包 + ICMPv6Packet icmpv6 = new ICMPv6Packet(TYPE_ECHO_REQUEST, 0); + icmpv6.setMessageBody(0x12345678); // 设置标识符和序列号 + + // 添加一些测试数据 + ByteBuffer testData = NetworkPacket.bufferAllocator.allocate(4); + testData.put("test".getBytes()); + testData.flip(); + icmpv6.data = testData; + + // 创建父IPv6包(用于校验和计算) + IPv6Packet ipv6 = new IPv6Packet(); + // 这里需要设置源和目的地址,但为了示例简化 + + icmpv6.setParent(ipv6); + + System.out.println("Original checksum: " + icmpv6.calculateChecksum()); + icmpv6.setChecksum(1); + System.out.println("Checksum verification (should be false): " + icmpv6.verifyChecksum()); + icmpv6.updateChecksum(); + System.out.println("Checksum verification (should be true): " + icmpv6.verifyChecksum()); + System.out.println(icmpv6); + } + + public ByteBuffer getHeader() { + return header; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ipv6/ICMPv6TimeExceededPacket.java b/src/org/kne/cloud/network/ipv6/ICMPv6TimeExceededPacket.java new file mode 100644 index 0000000..f6ddc74 --- /dev/null +++ b/src/org/kne/cloud/network/ipv6/ICMPv6TimeExceededPacket.java @@ -0,0 +1,69 @@ +package org.kne.cloud.network.ipv6; + +import java.io.IOException; +import java.nio.ByteBuffer; + +import org.kne.cloud.network.NetworkPacket; +import org.kne.io.KNEChannels; + +public class ICMPv6TimeExceededPacket extends ICMPv6Packet { + private static final int UNUSED_FIELD_LENGTH = 4; // 未使用字段长度 + + // 代码值常量 + public static final int CODE_HOP_LIMIT_EXCEEDED = 0; // 跳数限制超时 + public static final int CODE_FRAGMENT_REASSEMBLY_EXCEEDED = 1; // 分片重组超时 + + public ICMPv6TimeExceededPacket(int code) { + super(TYPE_TIME_EXCEEDED, code); + setUnused(0); + } + + /** + * 获取未使用字段(通常为0) + */ + public int getUnused() { + return getHeader().getInt(4); + } + + /** + * 设置未使用字段(通常设为0) + */ + public void setUnused(int unused) { + getHeader().putInt(4, unused); + } + + + /** + * 创建跳数限制超时包 + */ + public static ICMPv6TimeExceededPacket createHopLimitExceeded(IPv6Packet originalPacket) { + ICMPv6TimeExceededPacket packet = new ICMPv6TimeExceededPacket(CODE_HOP_LIMIT_EXCEEDED); + + // 包含原始数据包的前缀(根据RFC,尽可能包含但不超出最小MTU) + if (originalPacket == null) { + throw new NullPointerException("originalPacket is null!"); + } + // 这里简化处理,实际应该序列化原始包的前1280字节(IPv6最小MTU) + ByteBuffer buffer = NetworkPacket.bufferAllocator.allocate(65536); + buffer.clear(); + try { + originalPacket.writeToChannel(KNEChannels.newWritableChannel(buffer)); + } catch (IOException e) { + e.printStackTrace(); + } + buffer.flip(); + buffer.limit(Math.min(1280, buffer.limit())); + packet.getData().clear(); + packet.getData().put(buffer); + packet.getData().flip(); + return packet; + } + + @Override + public String toString() { + String codeStr = getCode() == CODE_HOP_LIMIT_EXCEEDED ? + "Hop Limit Exceeded" : "Fragment Reassembly Time Exceeded"; + return String.format("ICMPv6 Time Exceeded [%s, OriginalPrefix:%d bytes]", + codeStr, getDataLength()); + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ipv6/IPv6HopByHopTLV.java b/src/org/kne/cloud/network/ipv6/IPv6HopByHopTLV.java new file mode 100644 index 0000000..9c8e9ad --- /dev/null +++ b/src/org/kne/cloud/network/ipv6/IPv6HopByHopTLV.java @@ -0,0 +1,136 @@ +package org.kne.cloud.network.ipv6; + +import java.io.EOFException; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; + +import org.kne.cloud.network.NetworkPacket; + +public class IPv6HopByHopTLV extends TLV { + public static final int PAD1 = 0; + public static final int PADN = 1; + public static final int JUMBO_PAYLOAD = 0xC2; + public static final int ROUTER_ALERT = 0x05; + + public IPv6HopByHopTLV(ByteBuffer header) { + this(header, true); + } + + public IPv6HopByHopTLV(ByteBuffer header, boolean isDefault) { + super(header, isDefault); + } + + public IPv6HopByHopTLV(int type) { + this(type, true); + } + + public IPv6HopByHopTLV(int type, boolean isDefault) { + super(type, isDefault); + } + + public static IPv6HopByHopTLV readIPv6HopByHopTLVFromChannel(ReadableByteChannel din) throws IOException { + ByteBuffer bbf = NetworkPacket.bufferAllocator.allocate(2); + bbf.limit(1); + while (bbf.hasRemaining()) { + if (din.read(bbf) == -1) { + return null; + } + } + int type = bbf.get(0) & 0xff; + IPv6HopByHopTLV htlv; + + switch(type) { + case PAD1: + // Pad1: 只有类型字段,没有数据部分 + htlv = new Pad1HopByHopTLV(bbf); + htlv.readFromChannel(din, 0); + return htlv; + case PADN: + // PadN: 有数据部分 + htlv = new PadNHopByHopTLV(bbf); + htlv.readFromChannel(din, 0); + return htlv; + case ROUTER_ALERT: + // 路由器告警: 有数据部分 + htlv = new RouterAlertHopByHopTLV(bbf, true); + htlv.readFromChannel(din, 0); + return htlv; + case JUMBO_PAYLOAD: + // 巨型载荷: 有数据部分 + htlv = new JumboPayloadHopByHopTLV(bbf, true); + htlv.readFromChannel(din, 0); + return htlv; + default: + // 未知类型: 假设有数据部分 + htlv = new IPv6HopByHopTLV(bbf, true); + htlv.readFromChannel(din, 0); + return htlv; + } + } + + public static void writeIPv6HopByHopTLVToChannel(WritableByteChannel dto, IPv6HopByHopTLV tlv) throws IOException { + tlv.writeToChannel(dto); + } + + @Override + public String toString() { + return "IPv6HopByHopTLV [getType()=" + getType() + ", getDataLength()=" + getDataLength() + "]"; + } + +} + + + + + +/** + * 路由器告警 TLV - 有数据部分 + */ +class RouterAlertHopByHopTLV extends IPv6HopByHopTLV { + public RouterAlertHopByHopTLV(ByteBuffer header, boolean isDefault) { + super(header, isDefault); // isDefault = true: 有数据部分 + } + + public short getAlertValue() { + if (getData() != null && getData().remaining() >= 2) { + ByteBuffer duplicate = getData().duplicate(); + return duplicate.getShort(); + } + return 0; + } + + public void setAlertValue(short value) { + if (getData() == null) { + // 根据isDefault逻辑,可能需要分配数据缓冲区 + // 这里简化处理 + return; + } + ByteBuffer duplicate = getData().duplicate(); + duplicate.putShort(value); + } +} + +/** + * 巨型载荷 TLV - 有数据部分 + */ +class JumboPayloadHopByHopTLV extends IPv6HopByHopTLV { + public JumboPayloadHopByHopTLV(ByteBuffer header, boolean isDefault) { + super(header, isDefault); // isDefault = true: 有数据部分 + } + + public int getJumboLength() { + if (getData() != null && getData().remaining() >= 4) { + ByteBuffer duplicate = getData().duplicate(); + return duplicate.getInt(); + } + return 0; + } + + public void setJumboLength(int length) { + if (getData() == null) return; + ByteBuffer duplicate = getData().duplicate(); + duplicate.putInt(length); + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ipv6/IPv6LinkStateListener.java b/src/org/kne/cloud/network/ipv6/IPv6LinkStateListener.java new file mode 100644 index 0000000..64fd783 --- /dev/null +++ b/src/org/kne/cloud/network/ipv6/IPv6LinkStateListener.java @@ -0,0 +1,9 @@ +package org.kne.cloud.network.ipv6; + +import java.awt.event.ActionListener; + +public interface IPv6LinkStateListener { + public void onOnlineStateUpdate(IPv6NetworkLink link); + public void onAddressUpdate(IPv6NetworkLink link); + public void onLocatorUpdate(IPv6NetworkLink link); +} diff --git a/src/org/kne/cloud/network/ipv6/IPv6NetworkLink.java b/src/org/kne/cloud/network/ipv6/IPv6NetworkLink.java index b36b885..93f3d51 100644 --- a/src/org/kne/cloud/network/ipv6/IPv6NetworkLink.java +++ b/src/org/kne/cloud/network/ipv6/IPv6NetworkLink.java @@ -3,6 +3,8 @@ package org.kne.cloud.network.ipv6; import java.io.IOException; import java.net.Inet6Address; import java.util.*; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; import java.util.function.Consumer; import org.kne.cloud.network.ipv6.IPv6Packet; @@ -12,7 +14,7 @@ import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl; public interface IPv6NetworkLink { public boolean isLoopBack(); - public Inet6AddressGroup getAddressGroup(); + public List getAddressGroups(); public List getNeighborsInfo(); public List getRouteItems(); public void sendPacket(IPv6Packet pack, Inet6Address inet6Address) throws IOException; @@ -22,8 +24,10 @@ public interface IPv6NetworkLink { } public String getName(); public boolean isUp(); - public boolean canSend(IPv6Packet iPv6Packet); public void setReceiveConsumer(Consumercon); void setRerouteConsumer(Consumer rerouteConsumer); public boolean isReachSpeedLimit(IPv6Packet iPv6Packet); + public void setCongressCondition(Lock lock,Condition condition); + public void addIPv6LinkStateListener(IPv6LinkStateListener listener); + public void removeIPv6LinkStateListener(IPv6LinkStateListener listener); } diff --git a/src/org/kne/cloud/network/ipv6/IPv6Packet.java b/src/org/kne/cloud/network/ipv6/IPv6Packet.java index f50b8cc..02390e7 100644 --- a/src/org/kne/cloud/network/ipv6/IPv6Packet.java +++ b/src/org/kne/cloud/network/ipv6/IPv6Packet.java @@ -26,858 +26,1325 @@ import org.kne.cloud.network.srv6.SRv6Pad1TLV; import org.kne.cloud.network.srv6.SRv6PadNTLV; import org.kne.cloud.network.srv6.SRv6StreamSequenceTLV; import org.kne.cloud.network.srv6.SRv6TLV; +import org.kne.cloud.network.tcp.UDPPacket; +import org.kne.io.KNEChannels; import org.pcap4j.packet.namednumber.IpNumber; +/** + * IPv6数据包类,继承自NetworkPacket,用于处理IPv6网络数据包 + */ public class IPv6Packet extends NetworkPacket { - - private long flowSeqMark=-1; - - - - public long getFlowSeqMark() { - return flowSeqMark; + + // ==================== IPv6扩展头类型 ==================== + + /** 逐跳选项头 - RFC 8200 */ + public static final int HOP_BY_HOP_OPTIONS = 0; + + /** ICMPv4 - RFC 792 */ + public static final int ICMPv4 = 1; + + /** IGMP - RFC 1112 */ + public static final int IGMP = 2; + + /** IPv4封装 - RFC 2003 */ + public static final int IPv4 = 4; + + /** TCP - RFC 793 */ + public static final int TCP = 6; + + /** EGP - RFC 888 */ + public static final int EGP = 8; + + /** IGP - RFC 891 */ + public static final int IGP = 9; + + /** UDP - RFC 768 */ + public static final int UDP = 17; + + /** IPv6封装 - RFC 2473 */ + public static final int IPv6 = 41; + + /** 路由头 - RFC 8200 */ + public static final int ROUTING = 43; + + /** 分片头 - RFC 8200 */ + public static final int FRAGMENT = 44; + + /** RSVP - RFC 2205 */ + public static final int RSVP = 46; + + /** GRE - RFC 2784 */ + public static final int GRE = 47; + + /** 封装安全载荷 - RFC 4303 */ + public static final int ESP = 50; + + /** 认证头 - RFC 4302 */ + public static final int AH = 51; + + /** ICMPv6 - RFC 4443 */ + public static final int ICMPv6 = 58; + + /** 无下一个头 - RFC 8200 */ + public static final int NO_NEXT_HEADER = 59; + + /** 目的选项头 - RFC 8200 */ + public static final int DESTINATION_OPTIONS = 60; + + /** 移动IPv6 - RFC 6275 */ + public static final int MOBILITY = 135; + + /** Shim6 - RFC 5533 */ + public static final int SHIM6 = 140; + + /** 实验性和测试用途 - RFC 3692 */ + public static final int EXPERIMENTAL_1 = 253; + + /** 实验性和测试用途 - RFC 3692 */ + public static final int EXPERIMENTAL_2 = 254; + + /** 保留 - RFC 8200 */ + public static final int RESERVED = 255; + + // ==================== 上层协议类型 ==================== + + /** OSPF - RFC 2328 */ + public static final int OSPF = 89; + + /** SCTP - RFC 4960 */ + public static final int SCTP = 132; + + /** MPLS in IP - RFC 4023 */ + public static final int MPLS_IN_IP = 137; + + /** MANET协议 - RFC 5498 */ + public static final int MANET = 138; + + // ==================== 特殊用途 ==================== + + /** IPv6选项 - RFC 8200 */ + public static final int IPv6_OPTIONS = 0; + + /** 主机身份协议HIP(HOST_IDENTITY_PROTOCOL) - RFC 5201 */ + public static final int HIP = 139; + + /** 无线接入网协议 - RFC 5845 */ + public static final int WARP = 142; + + // ==================== SRv6相关常量 ==================== + + /** SRv6路由类型 */ + public static final int SRV6_ROUTING_TYPE = 4; + + // ==================== 地址相关常量 ==================== + + /** IPv6地址长度(字节) */ + public static final int IPV6_ADDRESS_LENGTH = 16; + + /** IPv6地址长整型部分数量 */ + public static final int IPV6_ADDRESS_LONGS = 2; + + // ==================== 位操作相关常量 ==================== + + public static final int BIT_MASK_LOW_4_BITS = 0b00001111; + public static final int BIT_MASK_HIGH_4_BITS = 0b11110000; + public static final int BIT_MASK_LOW_8_BITS = 0xFF; + public static final int BIT_MASK_LOW_16_BITS = 0xFFFF; + public static final int BIT_MASK_LOW_32_BITS = 0xFFFFFFFF; + + // ==================== 扩展头对齐常量 ==================== + + public static final int EXT_HEADER_ALIGNMENT = 8; + + // ==================== 工具方法 ==================== + + /** + * 获取Next Header的名称 + */ + public static String getName(int nextHeader) { + switch (nextHeader) { + case HOP_BY_HOP_OPTIONS: return "Hop-by-Hop Options"; + case ICMPv4: return "ICMPv4"; + case IGMP: return "IGMP"; + case IPv4: return "IPv4"; + case TCP: return "TCP"; + case EGP: return "EGP"; + case IGP: return "IGP"; + case UDP: return "UDP"; + case IPv6: return "IPv6"; + case ROUTING: return "Routing Header"; + case FRAGMENT: return "Fragment Header"; + case RSVP: return "RSVP"; + case GRE: return "GRE"; + case ESP: return "Encapsulating Security Payload"; + case AH: return "Authentication Header"; + case ICMPv6: return "ICMPv6"; + case NO_NEXT_HEADER: return "No Next Header"; + case DESTINATION_OPTIONS: return "Destination Options"; + case MOBILITY: return "Mobility Header"; + case HIP: return "Host Identity Protocol"; + case SHIM6: return "Shim6 Protocol"; + case EXPERIMENTAL_1: return "Experimental #1"; + case EXPERIMENTAL_2: return "Experimental #2"; + case RESERVED: return "Reserved"; + case OSPF: return "OSPF"; + case SCTP: return "SCTP"; + case MPLS_IN_IP: return "MPLS in IP"; + case MANET: return "MANET Protocols"; + case WARP: return "WARP"; + default: return "Unknown (" + nextHeader + ")"; + } + } + + /** + * 检查是否为IPv6扩展头 + */ + public static boolean isExtensionHeader(int nextHeader) { + return nextHeader == HOP_BY_HOP_OPTIONS || + nextHeader == ROUTING || + nextHeader == FRAGMENT || + nextHeader == DESTINATION_OPTIONS || + nextHeader == MOBILITY || + nextHeader == HIP || + nextHeader == SHIM6; + } + + /** + * 检查是否为传输层协议 + */ + public static boolean isTransportProtocol(int nextHeader) { + return nextHeader == TCP || + nextHeader == UDP || + nextHeader == SCTP; + } + + /** + * 检查是否为网络层协议 + */ + public static boolean isNetworkProtocol(int nextHeader) { + return nextHeader == IPv4 || + nextHeader == IPv6 || + nextHeader == ICMPv4 || + nextHeader == ICMPv6; + } + + private IPv6NetworkLink previousLink; + + public IPv6NetworkLink getPreviousLink() { + return previousLink; } - public void setFlowSeqMark(long flowSeqMark) { - this.flowSeqMark = flowSeqMark; - } - - - private boolean TTLdecreased=false; - - public boolean isTTLdecreased() { - return TTLdecreased; + public void setPreviousLink(IPv6NetworkLink previousLink) { + this.previousLink = previousLink; } - public void setTTLdecreased(boolean tTLdecreased) { - TTLdecreased = tTLdecreased; + // 流序列标记,用于标识数据包在流中的顺序 + private long flowSeqMark = -1; + + public long getFlowSeqMark() { + return flowSeqMark; + } + + public void setFlowSeqMark(long flowSeqMark) { + this.flowSeqMark = flowSeqMark; + } + + // TTL是否已减少的标志 + private boolean TTLdecreased = false; + + public boolean isTTLdecreased() { + return TTLdecreased; + } + + public void setTTLdecreased(boolean tTLdecreased) { + TTLdecreased = tTLdecreased; + } + + // IPv6头部数据缓冲区 + private volatile ByteBuffer IPv6header; + + // IPv6扩展头部列表 + private volatile List headers = new ArrayList<>(); + + // IPv6负载数据 + private IPv6Payload payload; + + // IPv6头部固定长度 + public static final int IPv6_HEADER_LENGTH = 40; + + // IPv6地址在头部中的偏移量 + private static final int SOURCE_ADDRESS_OFFSET = 8; + private static final int DESTINATION_ADDRESS_OFFSET = 24; + + public IPv6Payload getPayload() { + return payload; + } + + public void setPayload(IPv6Payload payload) { + this.payload = payload; + } + + /** + * 默认构造函数,初始化IPv6头部缓冲区 + */ + public IPv6Packet() { + IPv6header = NetworkPacket.bufferAllocator.allocate(IPv6_HEADER_LENGTH); + IPv6header.limit(IPv6_HEADER_LENGTH); + } + + /** + * 从字节中提取IP版本号 + * @param b 字节数据 + * @return IP版本号 + */ + public static int getIPVersion(byte b) { + return b >>> 4; + } + + /** + * 获取IPv6版本号 + * @return 版本号 + */ + public int getVersion() { + return IPv6header.get(0) >>> 4; + } + + /** + * 设置IPv6版本号 + * @param version 版本号 + */ + public void setVersion(int version) { + IPv6header.put(0, (byte) (IPv6header.get(0) & BIT_MASK_LOW_4_BITS | version << 4)); + } + + /** + * 获取流量类别 + * @return 流量类别 + */ + public int getTrafficClass() { + return (IPv6header.get(0) << 4) & (IPv6header.get(1) >>> 4) & BIT_MASK_LOW_8_BITS; + } + + /** + * 设置流量类别 + * @param trafficClass 流量类别 + */ + public void setTrafficClass(int trafficClass) { + IPv6header.put(0, (byte) (IPv6header.get(0) & BIT_MASK_HIGH_4_BITS | (trafficClass >>> 4))); + IPv6header.put(1, (byte) (IPv6header.get(1) & BIT_MASK_LOW_4_BITS | ((trafficClass & BIT_MASK_LOW_4_BITS) << 4))); + } + + /** + * 检查是否启用ECN(显式拥塞通知) + * @return 是否启用ECN + */ + public boolean isEnableECN() { + return (IPv6header.get(1) & 0b00110000) != 0; + } + + /** + * 启用ECN(显式拥塞通知) + */ + public void enableECN() { + IPv6header.put(1, (byte) ((IPv6header.get(1) & 0b11101111) | 0b00100000)); + } + + /** + * 标记CE(拥塞经历) + */ + public void markCE() { + IPv6header.put(1, (byte) (IPv6header.get(1) | 0b00110000)); + // new Exception().printStackTrace(); + } + + /** + * 检查是否标记了CE(拥塞经历) + * @return 是否标记了CE + */ + public boolean isCE() { + return ((IPv6header.get(1) >>> 4) & 0b11) == 0b11; + } + + /** + * 获取流标签 + * @return 流标签 + */ + public int getFlowLabel() { + return ((IPv6header.get(1) & BIT_MASK_LOW_4_BITS) << 16) | (IPv6header.getShort(2) & BIT_MASK_LOW_16_BITS); + } + + /** + * 设置流标签 + * @param flowLabel 流标签 + */ + public void setFlowLabel(int flowLabel) { + IPv6header.put(1, (byte) (IPv6header.get(1) & BIT_MASK_HIGH_4_BITS | (flowLabel >>> 16))); + IPv6header.putShort(2, (short) flowLabel); + } + + /** + * 获取负载长度 + * @return 负载长度 + */ + public int getPayloadLength() { + return IPv6header.getShort(4) & BIT_MASK_LOW_16_BITS; + } + + /** + * 设置负载长度 + * @param payloadLength 负载长度 + */ + public void setPayloadLength(int payloadLength) { + IPv6header.putShort(4, (short) payloadLength); + } + + /** + * 获取下一个头部协议类型 + * @return 下一个头部协议类型 + */ + public int getNextHeader() { + return IPv6header.get(6) & BIT_MASK_LOW_8_BITS; + } + + /** + * 设置下一个头部协议类型 + * @param nextHeader 下一个头部协议类型 + */ + public void setNextHeader(int nextHeader) { + IPv6header.put(6, (byte) nextHeader); + } + + /** + * 获取跳数限制 + * @return 跳数限制 + */ + public int getHopLimit() { + return IPv6header.get(7) & BIT_MASK_LOW_8_BITS; + } + + /** + * 设置跳数限制 + * @param hopLimit 跳数限制 + */ + public void setHopLimit(int hopLimit) { + IPv6header.put(7, (byte) hopLimit); + } + + /** + * 获取原始源地址字节数组 + * @param sourceAddress 用于存储源地址的字节数组 + */ + public void getRawSourceAddress(byte[] sourceAddress) { + IPv6header.get(SOURCE_ADDRESS_OFFSET, sourceAddress, 0, sourceAddress.length); + } + + /** + * 设置原始源地址字节数组 + * @param sourceAddress 源地址字节数组 + */ + public void setRawSourceAddress(byte[] sourceAddress) { + IPv6header.put(SOURCE_ADDRESS_OFFSET, sourceAddress, 0, sourceAddress.length); + } + + public IPv6RouteTableKey getSourceRouteTableKey() { + long most=IPv6header.getLong(SOURCE_ADDRESS_OFFSET); + long least=IPv6header.getLong(SOURCE_ADDRESS_OFFSET+8); + return new IPv6RouteTableKey(most, least); } - private volatile ByteBuffer IPv6header ; + + /** + * 获取原始目标地址字节数组 + * @param destinationAddress 用于存储目标地址的字节数组 + */ + public void getRawDestinationAddress(byte[] destinationAddress) { + IPv6header.get(DESTINATION_ADDRESS_OFFSET, destinationAddress, 0, destinationAddress.length); - private volatile List headers = new ArrayList<>(); + } - private IPv6Payload payload; + /** + * 设置原始目标地址字节数组 + * @param destinationAddress 目标地址字节数组 + */ + public void setRawDestinationAddress(byte[] destinationAddress) { + IPv6header.put(DESTINATION_ADDRESS_OFFSET, destinationAddress, 0, destinationAddress.length); + } - public static final int IPv6_HEADER_LENGTH = 40; - public IPv6Payload getPayload() { - return payload; + public IPv6RouteTableKey getDestinationRouteTableKey() { + long most=IPv6header.getLong(DESTINATION_ADDRESS_OFFSET); + long least=IPv6header.getLong(DESTINATION_ADDRESS_OFFSET+8); + return new IPv6RouteTableKey(most, least); } + + /** + * 获取源地址 + * @return 源地址 + */ + public Inet6Address getSourceAddress() { + byte[] b = new byte[IPV6_ADDRESS_LENGTH]; + IPv6header.get(SOURCE_ADDRESS_OFFSET, b, 0, b.length); + try { + return (Inet6Address) Inet6Address.getByAddress(b); + } catch (UnknownHostException e) { + return null; + } + } - public void setPayload(IPv6Payload payload) { - this.payload = payload; - } + /** + * 设置源地址 + * @param sourceAddress 源地址 + */ + public void setSourceAddress(Inet6Address sourceAddress) { + byte[] b = sourceAddress.getAddress(); + IPv6header.put(SOURCE_ADDRESS_OFFSET, b, 0, b.length); + } - public IPv6Packet() { - IPv6header = NetworkPacket.bufferAllocator.allocate(40); - IPv6header.limit(IPv6_HEADER_LENGTH); - } + /** + * 获取目标地址 + * @return 目标地址 + */ + public Inet6Address getDestinationAddress() { + byte[] b = new byte[IPV6_ADDRESS_LENGTH]; + IPv6header.get(DESTINATION_ADDRESS_OFFSET, b, 0, b.length); + try { + return (Inet6Address) Inet6Address.getByAddress(b); + } catch (UnknownHostException e) { + return null; + } + } - public static int getIPVersion(byte b) { - return b>>>4; - } - - public int getVersion() { - return IPv6header.get(0) >>> 4; - } + /** + * 设置目标地址 + * @param destinationAddress 目标地址 + */ + public void setDestinationAddress(Inet6Address destinationAddress) { + byte[] b = destinationAddress.getAddress(); + IPv6header.put(DESTINATION_ADDRESS_OFFSET, b, 0, b.length); + } + + + + /** + * 获取流会话信息 + * @return 流会话对象 + */ + public FlowSession getFlowSession() { + return new FlowSession(getSourceAddress(), getDestinationAddress(), getFlowLabel()); + } - public void setVersion(int version) { - IPv6header.put(0, (byte) (IPv6header.get(0) & 0b00001111 | version << 4)); - } + /** + * 计算负载长度 + * @return 负载长度 + */ + private int calcPayloadLength() { + int lth = 0; + for (int i = 0; i < headers.size(); i++) { + lth += headers.get(i).getTotalLength(); + } + lth += payload.getTotalLength(); + return lth; + } - public int getTrafficClass() { - return (IPv6header.get(0) << 4) & (IPv6header.get(1) >>> 4) & 0xff; - } + /** + * 获取数据包总长度 + * @return 数据包总长度 + */ + @Override + public long getTotalLength() { + return calcPayloadLength() + IPv6_HEADER_LENGTH; + } - public void setTrafficClass(int trafficClass) { - IPv6header.put(0, (byte) (IPv6header.get(0) & 0b11110000 | (trafficClass >>> 4))); - IPv6header.put(1, (byte) (IPv6header.get(1) & 0b00001111 | ((trafficClass & 0b00001111) << 4))); - } - - public boolean isEnableECN() { - return (IPv6header.get(1)&0b00110000)!=0; - } - - public void enableECN() { - IPv6header.put(1, (byte) ((IPv6header.get(1)&0b11101111)|0b00100000)); - } - - public void markCE() { - IPv6header.put(1,(byte) (IPv6header.get(1)|0b00110000)); - //new Exception().printStackTrace(); - } - - public boolean isCE() { - return ((IPv6header.get(1)>>>4)&0b11)==0b11; - } - - public int getFlowLabel() { - return ((IPv6header.get(1) & 0b00001111) << 16) | (IPv6header.getShort(2) & 0xffff); - } + /** + * 将数据包写入通道 + * @param dto 可写字节通道 + * @throws IOException 写入异常 + */ + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + if (headers.isEmpty()) { + setNextHeader(payload.getProtocolNumber()); + } else { + setNextHeader(headers.get(0).getProtocolNumber()); + } + setPayloadLength(calcPayloadLength()); + dto.write(IPv6header.slice(0, IPv6header.limit())); + for (int i = 0; i < headers.size(); i++) { + IPv6ExtHeader exth = headers.get(i); + if (i + 1 < headers.size()) { + exth.setNextHeader(headers.get(i + 1).getProtocolNumber()); + } else { + exth.setNextHeader(payload.getProtocolNumber()); + } + exth.writeToChannel(dto); + } + payload.writeToChannel(dto); + } - public void setFlowLabel(int flowLabel) { - IPv6header.put(1, (byte) (IPv6header.get(1) & 0b11110000 | (flowLabel >>> 16))); - IPv6header.putShort(2, (short) flowLabel); - } + /** + * 从通道读取数据包 + * @param din 可读字节通道 + * @param length 数据长度 + * @throws IOException 读取异常 + */ + @Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + IPv6header.limit(IPv6_HEADER_LENGTH); + IPv6header.position(0); + while (IPv6header.hasRemaining()) { + if (din.read(IPv6header) == -1) { + throw new EOFException(); + } + } + int payloadlength = getPayloadLength(); + int nextheader = getNextHeader(); + loop: while (true) { + IPv6ExtHeader ext; + switch (nextheader) { - public int getPayloadLength() { - return IPv6header.getShort(4) & 0xffff; - } + case HOP_BY_HOP_OPTIONS: // Hop-by-Hop选项头部 + ext = new IPv6HopByHopHeader(); + ext.readFromChannel(din, 0); + nextheader = ext.getNextHeader(); + payloadlength -= ext.getTotalLength(); + headers.add(ext); + break; + case DESTINATION_OPTIONS: // 目标选项头部 + ext = new IPv6DestinationHeader(); + ext.readFromChannel(din, 0); + nextheader = ext.getNextHeader(); + payloadlength -= ext.getTotalLength(); + headers.add(ext); + break; + case ROUTING: // 路由头部 + ByteBuffer bbf = NetworkPacket.bufferAllocator.allocate(2048); + bbf.limit(4); + while (bbf.hasRemaining()) { + if (din.read(bbf) == -1) { + throw new EOFException(); + } + } - public void setPayloadLength(int payloadLength) { - IPv6header.putShort(4, (short) payloadLength); - } + int routingType = bbf.get(2) & BIT_MASK_LOW_8_BITS; + switch (routingType) { + case SRV6_ROUTING_TYPE: // SRv6路由类型 + ext = new IPv6SegmentRoutingHeader(bbf); + break; + default: // 其他路由类型 + ext = new IPv6RoutingHeader(-1, bbf); + break; + } + ext.readFromChannel(din, 0); + nextheader = ext.getNextHeader(); + payloadlength -= ext.getTotalLength(); + headers.add(ext); + break; + case FRAGMENT: // 分段头部 + ext = new IPv6ExtHeader(nextheader); + ext.readFromChannel(din, 0); + nextheader = ext.getNextHeader(); + payloadlength -= ext.getTotalLength(); + headers.add(ext); + break; + case ESP: // ESP头部 + ext = new IPv6ExtHeader(nextheader); + ext.readFromChannel(din, 0); + nextheader = ext.getNextHeader(); + payloadlength -= ext.getTotalLength(); + headers.add(ext); + break; + case AH: // AH头部 + ext = new IPv6ExtHeader(nextheader); + ext.readFromChannel(din, 0); + nextheader = ext.getNextHeader(); + payloadlength -= ext.getTotalLength(); + headers.add(ext); + break; + case NO_NEXT_HEADER: // 无下一个头部 + ext = new IPv6ExtHeader(nextheader); + ext.readFromChannel(din, 0); + nextheader = ext.getNextHeader(); + payloadlength -= ext.getTotalLength(); + headers.add(ext); + break; + + case UDP: // UDP协议 + UDPPacket up=new UDPPacket(); + up.setParent(this); + up.readFromChannel(din,payloadlength); + this.payload=up; + break loop; + case KLALBPacket.KLALB_PROTOCOL_NUMBER: // KLALB协议 + KLALBPacket kp = KLALBPacket.readKLALBPacketFromChannel(din); + this.payload = kp; + break loop; + case EXPERIMENTAL_1: // 空负载 + IPv6Payload epld = new IPv6EmptyPayload(); + epld.readFromChannel(din, payloadlength); + this.payload = epld; + break loop; + default: // 其他协议类型 + IPv6Payload pld = new IPv6Payload(nextheader); + pld.readFromChannel(din, payloadlength); + this.payload = pld; + break loop; + } + } - public int getNextHeader() { - return IPv6header.get(6) & 0xff; - } + } - public void setNextHeader(int nextHeader) { - IPv6header.put(6, (byte) nextHeader); - } - public int getHopLimit() { - return IPv6header.get(7) & 0xff; - } + /** + * 转换为字符串表示 + * @return 字符串表示 + */ + @Override + public String toString() { + return "IPv6Packet [getVersion()=" + getVersion() + ", getTrafficClass()=" + getTrafficClass() + + ", getFlowLabel()=" + getFlowLabel() + ", getPayloadLength()=" + getPayloadLength() + + ", getNextHeader()=" + getNextHeader() + ", getHopLimit()=" + getHopLimit() + ", getSourceAddress()=" + + getSourceAddress() + ", getDestinationAddress()=" + getDestinationAddress() + ", getLength()=" + + getTotalLength() + ", headers=" + headers + ", payload=" + payload + "]"; + } - public void setHopLimit(int hopLimit) { - IPv6header.put(7, (byte) hopLimit); - } - - public void getRawSourceAddress(byte[] sourceAddress) { - IPv6header.get(8, sourceAddress, 0, sourceAddress.length); - } + /** + * IPv6负载数据类 + */ + public static class IPv6Payload extends NetworkPacket { + private ByteBuffer data; - public void setRawSourceAddress(byte[] sourceAddress) { - IPv6header.put(8, sourceAddress, 0, sourceAddress.length); - } + private boolean onDefault = true; - public void getRawDestinationAddress(byte[] destinationAddress) { - IPv6header.get(24, destinationAddress, 0,destinationAddress.length); - - } - public void setRawDestinationAddress(byte[] destinationAddress) { - IPv6header.put(24, destinationAddress, 0, destinationAddress.length); - } - - public Inet6Address getSourceAddress() { - byte[] b = new byte[16]; - IPv6header.get(8, b, 0, b.length); - try { - return (Inet6Address) Inet6Address.getByAddress(b); - } catch (UnknownHostException e) { - return null; - } - } + private IPv6Packet parent; + + public ByteBuffer getData() { + return data; + } - public void setSourceAddress(Inet6Address sourceAddress) { - byte[] b = sourceAddress.getAddress(); - IPv6header.put(8, b, 0, b.length); - } + private int protocolNumber; - public Inet6Address getDestinationAddress() { - byte[] b = new byte[16]; - IPv6header.get(24, b, 0, b.length); - try { - return (Inet6Address) Inet6Address.getByAddress(b); - } catch (UnknownHostException e) { - return null; - } - } + public IPv6Payload(int protocolNumber) { + this(protocolNumber, true); + } - public void setDestinationAddress(Inet6Address destinationAddress) { - byte[] b = destinationAddress.getAddress(); - IPv6header.put(24, b, 0, b.length); - } + protected IPv6Payload(int protocolNumber, boolean isonDefault) { + this.protocolNumber = protocolNumber; + this.onDefault = isonDefault; + if (onDefault) + this.data = NetworkPacket.bufferAllocator.allocate(65535); + } - public FlowSession getFlowSession() { - return new FlowSession(getSourceAddress(), getDestinationAddress(), getFlowLabel()); - } - - private int calcPayloadLength() { - int lth=0; - for (int i = 0; i < headers.size(); i++) { - lth+= headers.get(i).getLength(); - } - lth+=payload.getLength(); - return lth; - } - - @Override - public long getLength() { - return calcPayloadLength()+IPv6_HEADER_LENGTH; - } + public int getProtocolNumber() { + return protocolNumber; + } - + public long getTotalLength() { + return data.limit(); + } - @Override - public void writeToChannel(WritableByteChannel dto) throws IOException { - if(headers.isEmpty()) { - setNextHeader(payload.getProtocolNumber()); - }else { - setNextHeader(headers.get(0).getProtocolNumber()); - } - setPayloadLength(calcPayloadLength()); - dto.write(IPv6header.slice(0, IPv6header.limit())); - for (int i = 0; i < headers.size(); i++) { - IPv6ExtHeader exth=headers.get(i); - if(i+1 tlvs = new ArrayList(); + @Override public String toString() { - return "IPv6ExtHeader [protocolNumber=" + protocolNumber + ", getNextHeader()=" + getNextHeader() - + ", getExtLength()=" + getExtLength() + "]"; + return "IPv6HopByHopHeader [tlvs=" + tlvs + ", getProtocolNumber()=" + getProtocolNumber() + + ", getNextHeader()=" + getNextHeader() + ", getExtLength()=" + getExtLength() + "]"; } - public ByteBuffer getData() { - return data; - } - - public IPv6ExtHeader(int type) { - this(type,true); - } - - protected IPv6ExtHeader(int protocolNumber,boolean isonDefault) { - this.protocolNumber = protocolNumber; - this.onDefault=isonDefault; - if(onDefault) { - this.data=NetworkPacket.bufferAllocator.allocate(2048); - }else { - this.data=NetworkPacket.bufferAllocator.allocate(8); - } - } - - protected IPv6ExtHeader(int protocolNumber,boolean isonDefault,ByteBuffer data) { - this.protocolNumber = protocolNumber; - this.onDefault=isonDefault; - this.data=data; - } + public IPv6HopByHopHeader() { + super(HOP_BY_HOP_OPTIONS,2); + } - public int getProtocolNumber() { - return protocolNumber; - } - public int getNextHeader() { - return data.get(0) & 0xff; - } + public IPv6HopByHopHeader( ByteBuffer data) { + super(HOP_BY_HOP_OPTIONS, 2, data); + } - public void setNextHeader(int nextHeader) { - data.put(0, (byte) nextHeader); - } + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + int exl = calcTLVLength(); + if ((exl+2) % EXT_HEADER_ALIGNMENT != 0) { + throw new StreamCorruptedException("extLength % " + EXT_HEADER_ALIGNMENT + " !=0"); + } - public int getExtLength() { - return data.get(1) & 0xff; - } + setExtLength(((exl+2) / EXT_HEADER_ALIGNMENT)-1); + super.writeToChannel(dto); + for (IPv6HopByHopTLV tlv : tlvs) { + IPv6HopByHopTLV.writeIPv6HopByHopTLVToChannel(dto, tlv); + } + } - protected void setExtLength(int extLength) { - data.put(1, (byte) extLength); - } + private int calcTLVLength() { + int tlvsl = 0; + for (IPv6HopByHopTLV tlve : tlvs) { + tlvsl += tlve.getTotalLength(); + } + return tlvsl; + } - public long getLength() { - return data.limit(); - } + @Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + super.readFromChannel(din, length); + int extl = getExtLength(); - @Override - public void writeToChannel(WritableByteChannel dto) throws IOException { - if(onDefault) { - int ext=(data.limit()-8)/8; - setExtLength(ext); - dto.write(data.slice(0,data.limit())); - }else { - dto.write(data.slice(0,8)); - } - } + // 计算应该读取的总字节数 + int expectedTotalBytes = (extl + 1) * EXT_HEADER_ALIGNMENT; + int tlvBytesToRead = expectedTotalBytes - 2; // 减去基础头的2字节 + + tlvs.clear(); + int bytesRead = 0; + + // 读取直到达到预期的字节数 + while (bytesRead < tlvBytesToRead) { + IPv6HopByHopTLV tlv = IPv6HopByHopTLV.readIPv6HopByHopTLVFromChannel(din); + int tlvLength = (int) tlv.getTotalLength(); + + // 检查是否会超出预期范围 + if (bytesRead + tlvLength > tlvBytesToRead) { + throw new StreamCorruptedException( + String.format("TLV overflow: read %d + %d > %d bytes", + bytesRead, tlvLength, tlvBytesToRead)); + } + + tlvs.add(tlv); + bytesRead += tlvLength; + } + + // 验证实际读取的字节数与预期一致 + if (bytesRead != tlvBytesToRead) { + throw new StreamCorruptedException( + String.format("TLV length mismatch: expected %d, got %d", + tlvBytesToRead, bytesRead)); + } + } - @Override - public void readFromChannel(ReadableByteChannel din, long length) throws IOException { - data.limit(8); - while (data.hasRemaining()) { - if (din.read(data) == -1) { - throw new EOFException(); - } - } - if(onDefault) { - int newLimit=getExtLength()*8+data.limit(); - data.limit(newLimit); - while (data.hasRemaining()) { - if (din.read(data) == -1) { - throw new EOFException(); - } - } - } - } - - @Override - protected boolean needEndPosition() { - return false; - } - - - - - - } - public static class IPv6RoutingHeader extends IPv6ExtHeader{ - @Override - public String toString() { - return "IPv6RoutingHeader [protocolNumber=" + getProtocolNumber() + ", getNextHeader()=" + getNextHeader() - + ", getExtLength()=" + getExtLength()+ ", getRoutingType()="+getRoutingType() + "]"; - } - public IPv6RoutingHeader() { - super(43); - } - public IPv6RoutingHeader(boolean onDefault) { - super(43,onDefault); - } - - public IPv6RoutingHeader( boolean isonDefault, ByteBuffer data) { - super(43, isonDefault, data); - } - public int getRoutingType() { - return getData().get(2)&0xff; - } - public void setRoutingType(int routingTypr) { - getData().put(2, (byte) routingTypr); - } - public int getSegmentsLeft() { - return getData().get(3); - } - public void setSegmentsLeft(int segmentsLeft) { - getData().put(3,(byte) segmentsLeft); - } - } - - public static class IPv6SegmentRoutingHeader extends IPv6RoutingHeader{ - - private final List addresses=new ArrayList(); - private final List tlvs=new ArrayList(); - - - @Override - public String toString() { - return "IPv6SegmentRoutingHeader [addresses=" + addresses + ", tlvs=" + tlvs + ", getLastEntry()=" - + getLastEntry() + ", getFlags()=" + getFlags() + ", getTag()=" + getTag() + ", getAddresses()=" - + getAddresses() + ", getRoutingType()=" + getRoutingType() + ", getSegmentsLeft()=" - + getSegmentsLeft() + ", getProtocolNumber()=" + getProtocolNumber() + ", getNextHeader()=" - + getNextHeader() + ", getExtLength()=" + getExtLength() + "]"; - } - public IPv6SegmentRoutingHeader() { - super(false); - setRoutingType(4); - } - - public IPv6SegmentRoutingHeader(ByteBuffer bbf) { - super(false,bbf); - } - public IPv6SegmentRoutingHeader(List segs) { - this(); - this.addresses.addAll( segs); - int ln=addresses.size()-1; - setLastEntry(ln); - setSegmentsLeft(ln); - } - public int getLastEntry() { - return getData().get(4)&0xff; - } - - public void setLastEntry(int lastEntry) { - getData().put(4, (byte) lastEntry); - } - - public int getFlags() { - return getData().get(5)&0xff; - } - - public void setFlags(int flags) { - getData().put(5,(byte) flags); - } - - public int getTag() { - return getData().getShort(6)&0xffff; - } - - public void setTag(int tag) { - getData().putShort(6,(short) tag); - } - public List getAddresses() { - return addresses; - } - - public List getTlvs() { + @Override + public long getTotalLength() { + return calcTLVLength() + 2; + } + + public List getTlvs() { return tlvs; } - @Override - public void writeToChannel(WritableByteChannel dto) throws IOException { - int exl=calcExtLength(); - if(exl%8!=0) { - throw new StreamCorruptedException("extLength % 8 !=0"); - } - - setExtLength(exl/8); - setLastEntry(addresses.size()-1); - super.writeToChannel(dto); - - for(Inet6Address inet6Address:addresses) { - dto.write(ByteBuffer.wrap(inet6Address.getAddress())); - } - for(IPv6SegmentRoutingTLV tlv:tlvs) { - IPv6SegmentRoutingTLV.writeIPv6SegmentRoutingTLVToChannel(dto, tlv); - } - } - private int calcExtLength() { - int tlvsl=0; - for(IPv6SegmentRoutingTLV tlve:tlvs) { - tlvsl+=tlve.getLength(); - } - return addresses.size()*16+tlvsl; - } - @Override - public void readFromChannel(ReadableByteChannel din, long length) throws IOException { - super.readFromChannel(din, length); - int extl=getExtLength(); - int laste=getLastEntry(); - - int rl=extl*8; - int usdl=0; + } + + /** + * IPv6路由头部类 + */ + public static class IPv6RoutingHeader extends IPv6ExtHeader { + @Override + public String toString() { + return "IPv6RoutingHeader [protocolNumber=" + getProtocolNumber() + ", getNextHeader()=" + getNextHeader() + + ", getExtLength()=" + getExtLength() + ", getRoutingType()=" + getRoutingType() + "]"; + } - //System.out.println("SR length:"+(laste+1)); - addresses.clear(); - ByteBuffer bfr=NetworkPacket.bufferAllocator.allocate(16); - for (int i = 0; i < (laste+1); i++) { - bfr.clear(); - while (bfr.hasRemaining()) { - if (din.read(bfr) == -1) { - throw new EOFException(); - } - } - bfr.flip(); - usdl+=bfr.limit(); - Inet6Address addr=(Inet6Address) Inet6Address.getByAddress(bfr.array()); - //System.out.println("SR:"+addr); - addresses.add(addr); - } - tlvs.clear(); - while(usdl getHeaders() { - return headers; - } - public IPv6SegmentRoutingHeader getSRHHeader() { - IPv6SegmentRoutingHeader srhh = null; - List exhs = headers; - for (int j = 0; j < exhs.size(); j++) { - IPv6ExtHeader exh = exhs.get(j); - if (exh instanceof IPv6SegmentRoutingHeader) { - if (((IPv6SegmentRoutingHeader) exh).getRoutingType() == 4) { - srhh = (IPv6SegmentRoutingHeader) exh; - break; - } - } - } - return srhh; - } - /*public IPv6DestinationHeader insertDestinationHeader(int index,int extLength) { - long ptr; - long lth=extLength*8+8; - if(index==headers.size()) { - ptr=payload.getPointer(); - }else if(index=headers.size()) { - irh.setNextHeader(payload.getType()); - }else { - irh.setNextHeader(headers.get(index).getType()); - } - if(index-1<0) { - setNextHeader(irh.getType()); - }else { - headers.get(index-1).setNextHeader(irh.getType()); - } - headers.add(index, irh); - analyse(); - return irh; - } - public IPv6RoutingHeader insertSRHRoutingHeader(int index,IpV6RoutingSRHData srh) { - long ptr; - long lth=srh.length()+4; - if(index==headers.size()) { - ptr=payload.getPointer(); - }else if(index=headers.size()) { - irh.setNextHeader(payload.getType()); - }else { - irh.setNextHeader(headers.get(index).getType()); - } - if(index-1<0) { - setNextHeader(irh.getType()); - }else { - headers.get(index-1).setNextHeader(irh.getType()); - } - headers.add(index, irh); - irh.setRoutingType(4); - irh.setSegmentsLeft(srh.getLastEntry()); - irh.getData().put(4, srh.getRawData()); - analyse(); - return irh; - }*/ - @Override - protected boolean needEndPosition() { - return false; - } - private AtomicInteger rerouteCounter=new AtomicInteger(0); - public AtomicInteger getRerouteCounter() { - return rerouteCounter; - } - private volatile boolean promise=false; - public void setPromise(boolean b) { - promise=b; - } + public IPv6RoutingHeader() { + super(ROUTING); + } - public boolean isPromise() { - return promise; - } + public IPv6RoutingHeader(int bufferLength) { + super(ROUTING, bufferLength); + } + + public IPv6RoutingHeader(int bufferLength, ByteBuffer data) { + super(ROUTING, bufferLength, data); + } + + public int getRoutingType() { + return getData().get(2) & BIT_MASK_LOW_8_BITS; + } + + public void setRoutingType(int routingTypr) { + getData().put(2, (byte) routingTypr); + } + + public int getSegmentsLeft() { + return getData().get(3); + } + + public void setSegmentsLeft(int segmentsLeft) { + getData().put(3, (byte) segmentsLeft); + } + } + + /** + * IPv6段路由头部类 + */ + /** + * IPv6 Segment Routing Header (SRH) 实现 + * + *

根据 RFC 8754 实现,支持SRv6扩展头和TLV选项

+ * + *
+     *   0                   1                   2                   3
+     *   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+     *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     *  | Next Header   |  Hdr Ext Len  | Routing Type  | Segments Left |
+     *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     *  |     Last Entry    |     Flags     |              Tag          |
+     *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     *  |                                                               |
+     *  |            Segment List[0] (128-bit IPv6 address)            |
+     *  |                                                               |
+     *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     *  |                               ...                             |
+     *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     *  |                                                               |
+     *  |            Segment List[n] (128-bit IPv6 address)            |
+     *  |                                                               |
+     *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     *  //                                                             //
+     *  //         Optional Type-Length-Value objects (variable)       //
+     *  //                                                             //
+     *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     * 
+ */ + public static class IPv6SegmentRoutingHeader extends IPv6RoutingHeader { + + private final List addresses = new ArrayList(); + private final List tlvs = new ArrayList(); + + @Override + public String toString() { + return "IPv6SegmentRoutingHeader [addresses=" + addresses + ", tlvs=" + tlvs + ", getLastEntry()=" + + getLastEntry() + ", getFlags()=" + getFlags() + ", getTag()=" + getTag() + ", getAddresses()=" + + getAddresses() + ", getRoutingType()=" + getRoutingType() + ", getSegmentsLeft()=" + + getSegmentsLeft() + ", getProtocolNumber()=" + getProtocolNumber() + ", getNextHeader()=" + + getNextHeader() + ", getExtLength()=" + getExtLength() + "]"; + } + + public IPv6SegmentRoutingHeader() { + super(EXT_HEADER_ALIGNMENT); + setRoutingType(SRV6_ROUTING_TYPE); + } + + public IPv6SegmentRoutingHeader(ByteBuffer bbf) { + super(EXT_HEADER_ALIGNMENT, bbf); + } + + public IPv6SegmentRoutingHeader(List segs) { + this(); + this.addresses.addAll(segs); + int ln = addresses.size() - 1; + setLastEntry(ln); + setSegmentsLeft(ln); + } + + public int getLastEntry() { + return getData().get(4) & BIT_MASK_LOW_8_BITS; + } + + public void setLastEntry(int lastEntry) { + getData().put(4, (byte) lastEntry); + } + + public int getFlags() { + return getData().get(5) & BIT_MASK_LOW_8_BITS; + } + + public void setFlags(int flags) { + getData().put(5, (byte) flags); + } + + public int getTag() { + return getData().getShort(6) & BIT_MASK_LOW_16_BITS; + } + + public void setTag(int tag) { + getData().putShort(6, (short) tag); + } + + public List getAddresses() { + return addresses; + } + + public List getTlvs() { + return tlvs; + } + + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + int exl = calcExtLength(); + if (exl % EXT_HEADER_ALIGNMENT != 0) { + throw new StreamCorruptedException("extLength % " + EXT_HEADER_ALIGNMENT + " !=0"); + } + + setExtLength(exl / EXT_HEADER_ALIGNMENT); + setLastEntry(addresses.size() - 1); + super.writeToChannel(dto); + + for (Inet6Address inet6Address : addresses) { + dto.write(ByteBuffer.wrap(inet6Address.getAddress())); + } + for (IPv6SegmentRoutingTLV tlv : tlvs) { + IPv6SegmentRoutingTLV.writeIPv6SegmentRoutingTLVToChannel(dto, tlv); + } + } + + private int calcExtLength() { + int tlvsl = 0; + for (IPv6SegmentRoutingTLV tlve : tlvs) { + tlvsl += tlve.getTotalLength(); + } + return addresses.size() * IPV6_ADDRESS_LENGTH + tlvsl; + } + + /*@Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + super.readFromChannel(din, length); + int extl = getExtLength(); + int laste = getLastEntry(); + + int rl = extl * EXT_HEADER_ALIGNMENT; + int usdl = 0; + + // System.out.println("SR length:"+(laste+1)); + addresses.clear(); + ByteBuffer bfr = NetworkPacket.bufferAllocator.allocateHeap(IPV6_ADDRESS_LENGTH); + for (int i = 0; i < (laste + 1); i++) { + bfr.clear(); + while (bfr.hasRemaining()) { + if (din.read(bfr) == -1) { + throw new EOFException(); + } + } + bfr.flip(); + usdl += bfr.limit(); + Inet6Address addr = (Inet6Address) Inet6Address.getByAddress(bfr.array()); + // System.out.println("SR:"+addr); + addresses.add(addr); + } + tlvs.clear(); + while (usdl < rl) { + IPv6SegmentRoutingTLV tlv = IPv6SegmentRoutingTLV.readIPv6SegmentRoutingTLVFromChannel(din); + usdl += tlv.getTotalLength(); + tlvs.add(tlv); + } + + return; + }*/ + @Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + super.readFromChannel(din, length); + + ByteBuffer bfr = null; + int extl = getExtLength(); + int laste = getLastEntry(); + int rl = extl * EXT_HEADER_ALIGNMENT; + int usdl = 0; + + // 验证lastEntry的合理性 + if (laste < 0 ) { + throw new StreamCorruptedException("Invalid lastEntry: " + laste); + } + + addresses.clear(); + bfr = NetworkPacket.bufferAllocator.allocateHeap(IPV6_ADDRESS_LENGTH); + + for (int i = 0; i <= laste; i++) { // 注意:应该是 <= laste + bfr.clear(); + KNEChannels.readFully(din, bfr); + bfr.flip(); + usdl += bfr.limit(); + Inet6Address addr = (Inet6Address) Inet6Address.getByAddress(bfr.array()); + addresses.add(addr); + } + + tlvs.clear(); + while (usdl < rl) { + IPv6SegmentRoutingTLV tlv = IPv6SegmentRoutingTLV.readIPv6SegmentRoutingTLVFromChannel(din); + usdl += tlv.getTotalLength(); + tlvs.add(tlv); + } + + // 验证读取的字节数与预期一致 + if (usdl != rl) { + throw new StreamCorruptedException("Length mismatch: expected " + rl + ", got " + usdl); + } + + + } + + // 辅助方法:确保读取完整数据 + private int readFully(ReadableByteChannel channel, ByteBuffer buffer) throws IOException { + int totalRead = 0; + while (buffer.hasRemaining()) { + int read = channel.read(buffer); + if (read == -1) { + break; + } + totalRead += read; + } + return totalRead; + } + @Override + public long getTotalLength() { + return calcExtLength() + EXT_HEADER_ALIGNMENT; + } + + } + + /** + * IPv6目标选项头部类 + */ + public static class IPv6DestinationHeader extends IPv6ExtHeader { + @Override + public String toString() { + return "IPv6DestinationHeader [protocolNumber=" + getProtocolNumber() + ", getNextHeader()=" + + getNextHeader() + ", getExtLength()=" + getExtLength() + ", getRoutingType()=" + getRoutingType() + + "]"; + } + + public IPv6DestinationHeader() { + super(DESTINATION_OPTIONS); + } + + public int getRoutingType() { + return getData().get(2) & BIT_MASK_LOW_8_BITS; + } + + public void setRoutingType(int routingTypr) { + getData().put(2, (byte) routingTypr); + } + + public int getSegmentsLeft() { + return getData().get(3); + } + + public void setSegmentsLeft(int segmentsLeft) { + getData().put(3, (byte) segmentsLeft); + } + } + + /** + * 获取所有扩展头部 + * @return 扩展头部列表 + */ + public List getHeaders() { + return headers; + } + + /** + * 获取IPv6逐跳头部 + * @return IPv6段逐跳头部,如果不存在则返回null + */ + public IPv6HopByHopHeader getHopByHopHeader() { + IPv6HopByHopHeader hoph = null; + List exhs = headers; + for (int j = 0; j < exhs.size(); j++) { + IPv6ExtHeader exh = exhs.get(j); + if (exh instanceof IPv6HopByHopHeader) { + hoph=(IPv6HopByHopHeader) exh; + break; + } + } + return hoph; + } + + /** + * 获取SRv6段路由头部 + * @return SRv6段路由头部,如果不存在则返回null + */ + public IPv6SegmentRoutingHeader getSRHHeader() { + IPv6SegmentRoutingHeader srhh = null; + List exhs = headers; + for (int j = 0; j < exhs.size(); j++) { + IPv6ExtHeader exh = exhs.get(j); + if (exh instanceof IPv6SegmentRoutingHeader) { + if (((IPv6SegmentRoutingHeader) exh).getRoutingType() == SRV6_ROUTING_TYPE) { + srhh = (IPv6SegmentRoutingHeader) exh; + break; + } + } + } + return srhh; + } + + + @Override + protected boolean needEndPosition() { + return false; + } + + // 重路由计数器 + private AtomicInteger rerouteCounter = new AtomicInteger(0); + + public AtomicInteger getRerouteCounter() { + return rerouteCounter; + } + + // 承诺标志,用于某种状态跟踪 + private volatile boolean promise = true; + + public void setPromise(boolean b) { + promise = b; + } + + public boolean isPromise() { + return promise; + } - - - -} +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ipv6/IPv6RouteTableKey.java b/src/org/kne/cloud/network/ipv6/IPv6RouteTableKey.java new file mode 100644 index 0000000..0914cc3 --- /dev/null +++ b/src/org/kne/cloud/network/ipv6/IPv6RouteTableKey.java @@ -0,0 +1,305 @@ +package org.kne.cloud.network.ipv6; + +import java.net.Inet6Address; +import java.util.Objects; + +public class IPv6RouteTableKey { + private long most; + private long least; + + public IPv6RouteTableKey(byte[] address) { + long[] l = inet6AddressToLongs(address); + this.most = l[0]; + this.least = l[1]; // 修复:应该是 l[1] 而不是 l[0] + } + + public IPv6RouteTableKey(long most, long least) { + super(); + this.most = most; + this.least = least; + } + + public IPv6RouteTableKey(Inet6Address address) { + this(address.getAddress()); + } + + public IPv6RouteTableKey(Inet6AddressGroup address) { + this(address.getAddress()); + applyMask(address.getPrefixLength()); + } + + public long getMost() { + return most; + } + + public long getLeast() { + return least; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (least ^ (least >>> 32)); + result = prime * result + (int) (most ^ (most >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + IPv6RouteTableKey other = (IPv6RouteTableKey) obj; + if (least != other.least) + return false; + if (most != other.most) + return false; + return true; + } + + + /** + * 根据前缀长度应用掩码,仅保留网络部分 + * @param prefixLength 前缀长度 (0-128) + * @return 应用掩码后的新 IPv6RouteTableKey 对象 + */ + public IPv6RouteTableKey mask(int prefixLength) { + if (prefixLength < 0 || prefixLength > 128) { + throw new IllegalArgumentException("前缀长度必须在 0 到 128 之间"); + } + + if (prefixLength == 0) { + return new IPv6RouteTableKey(0L, 0L); // 默认路由 + } + + long maskedMost = this.most; + long maskedLeast = this.least; + + if (prefixLength <= 64) { + // 仅影响高位 + long mask = createMask(prefixLength); + maskedMost &= mask; + maskedLeast = 0L; // 低位全部清零 + } else { + // 影响高位和部分低位 + int lowPrefixLength = prefixLength - 64; + long lowMask = createMask(lowPrefixLength); + maskedLeast &= lowMask; + // 高位保持不变 + } + + return new IPv6RouteTableKey(maskedMost, maskedLeast); + } + + + /** + * 根据前缀长度应用掩码,仅保留网络部分 + * @param prefixLength 前缀长度 (0-128) + * @return 应用掩码后的新 IPv6RouteTableKey 对象 + */ + public void applyMask(int prefixLength) { + if (prefixLength < 0 || prefixLength > 128) { + throw new IllegalArgumentException("前缀长度必须在 0 到 128 之间"); + } + + if (prefixLength == 0) { + this.most=0; + this.least=0; + return; + //return new IPv6RouteTableKey(0L, 0L); // 默认路由 + } + + long maskedMost = this.most; + long maskedLeast = this.least; + + if (prefixLength <= 64) { + // 仅影响高位 + long mask = createMask(prefixLength); + maskedMost &= mask; + maskedLeast = 0L; // 低位全部清零 + } else { + // 影响高位和部分低位 + int lowPrefixLength = prefixLength - 64; + long lowMask = createMask(lowPrefixLength); + maskedLeast &= lowMask; + // 高位保持不变 + } + this.most=maskedMost; + this.least=maskedLeast; + // return new IPv6RouteTableKey(maskedMost, maskedLeast); + } + + /** + * 创建指定长度的掩码 + * @param bits 要保留的位数 (0-64) + * @return 掩码值 + */ + private long createMask(int bits) { + // 使用查表法,预先计算所有可能的掩码值 + return MASK_TABLE[bits]; + } + + // 预计算的掩码表 + private static final long[] MASK_TABLE = new long[65]; // 0-64 共65个值 + + // 静态初始化块,在类加载时预计算所有掩码值 + static { + for (int bits = 0; bits <= 64; bits++) { + if (bits == 0) { + MASK_TABLE[bits] = 0L; + } else if (bits == 64) { + MASK_TABLE[bits] = -1L; + } else { + MASK_TABLE[bits] = (-1L) << (64 - bits); + } + } + } + + /** + * 将 byte[] 转换为两个 long 值(高位和低位) + * @param bytes 16字节的IPv6地址 + * @return 包含两个long值的数组,第一个是高位,第二个是低位 + */ + public static long[] inet6AddressToLongs(byte[] bytes) { + if (bytes.length != 16) { + throw new IllegalArgumentException("IPv6地址必须是16字节"); + } + + long high = 0; + long low = 0; + + // 处理前8字节(高位) + for (int i = 0; i < 8; i++) { + high = (high << 8) | (bytes[i] & 0xFF); + } + + // 处理后8字节(低位) + for (int i = 8; i < 16; i++) { + low = (low << 8) | (bytes[i] & 0xFF); + } + + return new long[]{high, low}; + } + + /** + * 将两个long值转换回byte[] + * @param high 高位long值 + * @param low 低位long值 + * @return 16字节的IPv6地址 + */ + public static byte[] longsToInet6Address(long high, long low) { + byte[] bytes = new byte[16]; + + // 提取高位的8个字节 + for (int i = 0; i < 8; i++) { + bytes[i] = (byte) ((high >> (56 - i * 8)) & 0xFF); + } + + // 提取低位的8个字节 + for (int i = 0; i < 8; i++) { + bytes[8 + i] = (byte) ((low >> (56 - i * 8)) & 0xFF); + } + + return bytes; + } + + @Override + public String toString() { + return String.format("%016x:%016x", most, least); + } + + /** + * 单元测试 + */ + public static void main(String[] args) { + for(int i=0;i<65;i++) { + long l=MASK_TABLE[i]; + System.out.println(Long.toUnsignedString(l, 16)); + } + + System.out.println("开始 IPv6RouteTableKey 单元测试..."); + + // 测试1: 基本转换测试 + System.out.println("\n1. 测试基本转换:"); + byte[] testAddress = new byte[16]; + // 创建测试地址: 2001:0db8:85a3::8a2e:0370:7334 + testAddress[0] = 0x20; testAddress[1] = 0x01; + testAddress[2] = 0x0d; testAddress[3] = (byte) 0xb8; + testAddress[4] = (byte) 0x85; testAddress[5] = (byte) 0xa3; + // 中间部分为0 + testAddress[12] = (byte) 0x8a; testAddress[13] = 0x2e; + testAddress[14] = 0x03; testAddress[15] = 0x70; + // testAddress[16] = 0x73; testAddress[17] = 0x34; // 注意: 数组只有16个元素 + + IPv6RouteTableKey key = new IPv6RouteTableKey(testAddress); + System.out.println("原始地址: " + key); + + // 测试2: 掩码应用测试 + System.out.println("\n2. 测试掩码应用:"); + IPv6RouteTableKey masked64 = key.mask(64); + System.out.println("/64 掩码: " + masked64); + + IPv6RouteTableKey masked48 = key.mask(48); + System.out.println("/48 掩码: " + masked48); + + IPv6RouteTableKey masked128 = key.mask(128); + System.out.println("/128 掩码: " + masked128); + + IPv6RouteTableKey masked0 = key.mask(0); + System.out.println("/0 掩码: " + masked0); + + // 测试3: 相等性测试 + System.out.println("\n3. 测试相等性:"); + IPv6RouteTableKey key2 = new IPv6RouteTableKey(testAddress); + System.out.println("相同地址是否相等: " + key.equals(key2)); + System.out.println("哈希码是否相同: " + (key.hashCode() == key2.hashCode())); + + // 测试4: 转换函数测试 + System.out.println("\n4. 测试转换函数:"); + long[] longs = inet6AddressToLongs(testAddress); + System.out.println("转换为longs: " + Long.toHexString(longs[0]) + ":" + Long.toHexString(longs[1])); + + byte[] reconverted = longsToInet6Address(longs[0], longs[1]); + boolean conversionOk = true; + for (int i = 0; i < 16; i++) { + if (testAddress[i] != reconverted[i]) { + conversionOk = false; + break; + } + } + System.out.println("转换是否可逆: " + conversionOk); + + // 测试5: 边界条件测试 + System.out.println("\n5. 测试边界条件:"); + try { + key.applyMask(-1); + System.out.println("错误: 应该抛出异常"); + } catch (IllegalArgumentException e) { + System.out.println("正确: 负前缀长度抛出异常"); + } + + try { + key.applyMask(129); + System.out.println("错误: 应该抛出异常"); + } catch (IllegalArgumentException e) { + System.out.println("正确: 过大前缀长度抛出异常"); + } + + // 测试6: 全零和全一地址测试 + System.out.println("\n6. 测试特殊地址:"); + byte[] allZeros = new byte[16]; + IPv6RouteTableKey zeroKey = new IPv6RouteTableKey(allZeros); + System.out.println("全零地址: " + zeroKey); + + byte[] allOnes = new byte[16]; + for (int i = 0; i < 16; i++) allOnes[i] = (byte) 0xFF; + IPv6RouteTableKey onesKey = new IPv6RouteTableKey(allOnes); + System.out.println("全一地址: " + onesKey); + + System.out.println("\n所有测试完成!"); + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java b/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java index 5372959..68d9296 100644 --- a/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java +++ b/src/org/kne/cloud/network/ipv6/IPv6TUNLoopbackNetworkLink.java @@ -11,10 +11,12 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.LockSupport; import java.util.concurrent.locks.ReentrantLock; @@ -40,7 +42,7 @@ import org.kne.concurrent.HighPerformanceExecutor; import org.kne.concurrent.SpinLock; import org.kne.io.KNEChannels; -public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, AutoCloseable { +public class IPv6TUNLoopbackNetworkLink extends AbstractIPv6NetworkLink implements IPv6NetworkLink, Closeable, AutoCloseable { public static final String KLALB_DECENTRALIZED_S_RV6_NETWORK = "KLALB Decentralized SRv6 Network"; @@ -76,7 +78,7 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A } Thread tb = new Thread(() -> { while (true) { - ByteBuffer tmp = NetworkPacket.bufferAllocator.allocate(65535); + ByteBuffer tmp = NetworkPacket.bufferAllocator.allocateNative(65535); try { tun.read(tmp); tmp.flip(); @@ -91,8 +93,8 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A //NetworkPacket.databufferpool_65535.back(tmp); if (con != null) { - monitor.getOutPacketCounterAL().incrementAndGet(); - monitor.getOutTrafficAL().addAndGet(ipp.getLength()); + monitor.getOutPacketCounterAL().add(1); + monitor.getOutTrafficAL().add(ipp.getTotalLength()); // ipp.setDisposeAfterSend(true); // ipp.getPayload().setDisposeAfterSend(true); ipp.setPromise(true); @@ -152,6 +154,7 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A }catch(UnsatisfiedLinkError e) { throw new IOException(e); } + onOnlineStateUpdate(); } private LinkedBlockingQueue sendQueue = new LinkedBlockingQueue(); @@ -210,14 +213,15 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A SRv6PacketReorder newr= new SRv6PacketReorder(new PacketConsumer() { @Override - public void accept(IPv6Packet packx) throws IOException { - ByteBuffer tmp = NetworkPacket.bufferAllocator.allocate(65535); + public boolean accept(IPv6Packet packx) throws IOException { + ByteBuffer tmp = NetworkPacket.bufferAllocator.allocateNative(65535); packx.writeToChannel(KNEChannels.newWritableChannel(tmp)); - monitor.getInPacketCounterAL().incrementAndGet(); - monitor.getInTrafficAL().addAndGet(packx.getLength()); + monitor.getInPacketCounterAL().add(1); + monitor.getInTrafficAL().add(packx.getTotalLength()); tmp.flip(); sendQueue.add(tmp); LockSupport.unpark(tr); + return true; } }); SRv6PacketReorder olr=reorder.putIfAbsent(fss,newr); @@ -230,8 +234,8 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A }else { ByteBuffer tmp = NetworkPacket.bufferAllocator.allocate(65535); pack.writeToChannel(KNEChannels.newWritableChannel(tmp)); - monitor.getInPacketCounterAL().incrementAndGet(); - monitor.getInTrafficAL().addAndGet(pack.getLength()); + monitor.getInPacketCounterAL().add(1); + monitor.getInTrafficAL().add(pack.getTotalLength()); tmp.flip(); sendQueue.add(tmp); LockSupport.unpark(tr); @@ -282,11 +286,7 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A tun.close(); tun = null; } - } - - @Override - public boolean canSend(IPv6Packet iPv6Packet) { - return true; + onOnlineStateUpdate(); } @Override @@ -303,8 +303,8 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A } @Override - public Inet6AddressGroup getAddressGroup() { - return hostAddress; + public List< Inet6AddressGroup> getAddressGroups() { + return List.of(hostAddress); } @Override @@ -316,8 +316,10 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A public List getRouteItems() { List rlist=new ArrayList<>(); - rlist.add(new RouteItem(new Inet6AddressGroup(this.getAddressGroup().getAddress(), 128), - this.getAddressGroup().getAddress(), this, "Direct", 0, 1, null, "D",true)); + for(Inet6AddressGroup grp:getAddressGroups()) { + rlist.add(new RouteItem(new Inet6AddressGroup(grp.getAddress(), 128), + grp.getAddress(), this, "Direct", 0, 1, null, "D",true)); + } for (Iterator iteratorx = getNeighborsInfo() .iterator(); iteratorx.hasNext();) { @@ -339,4 +341,11 @@ public class IPv6TUNLoopbackNetworkLink implements IPv6NetworkLink, Closeable, A return false; } + @Override + public void setCongressCondition(Lock lock, Condition condition) { + // TODO 自动生成的方法存根 + + } + + } diff --git a/src/org/kne/cloud/network/ipv6/Inet6AddressGroup.java b/src/org/kne/cloud/network/ipv6/Inet6AddressGroup.java index fea8b16..e5036ba 100644 --- a/src/org/kne/cloud/network/ipv6/Inet6AddressGroup.java +++ b/src/org/kne/cloud/network/ipv6/Inet6AddressGroup.java @@ -8,6 +8,7 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; import java.util.Objects; +import java.util.UUID; public class Inet6AddressGroup implements Comparable{ private static final byte[][] maskTransf=new byte[129][16]; @@ -121,4 +122,21 @@ public class Inet6AddressGroup implements Comparable{ prefixLength=in.read(); } + public Inet6AddressGroup createPrefixOnlyAddressGroup(int newPrefixLength) { + byte[]mask=maskTransf[newPrefixLength]; + byte[]andm=getAndm(mask); + try { + return new Inet6AddressGroup((Inet6Address) Inet6Address.getByAddress(andm), newPrefixLength); + } catch (UnknownHostException e) { + return null; + } + } + public Inet6AddressGroup createPrefixOnlyAddressGroup() { + return createPrefixOnlyAddressGroup(prefixLength); + } + public static void main(String[] args) throws UnknownHostException { + Inet6AddressGroup i6ag=new Inet6AddressGroup((Inet6Address) Inet6Address.getByName("1234:1234::1234"),12); + System.out.println(i6ag); + System.out.println(i6ag.createPrefixOnlyAddressGroup()); + } } diff --git a/src/org/kne/cloud/network/ipv6/LoopbackIPv6NetworkLink.java b/src/org/kne/cloud/network/ipv6/LoopbackIPv6NetworkLink.java new file mode 100644 index 0000000..410706c --- /dev/null +++ b/src/org/kne/cloud/network/ipv6/LoopbackIPv6NetworkLink.java @@ -0,0 +1,162 @@ +package org.kne.cloud.network.ipv6; + +import java.io.IOException; +import java.net.Inet6Address; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.function.Consumer; + +import org.kne.cloud.network.srv6.PacketConsumer; +import org.kne.cloud.network.srv6.SRv6Router; + +public class LoopbackIPv6NetworkLink extends AbstractIPv6NetworkLink implements IPv6NetworkLink { + private IPv6NetworkLink fallbackLink; + + + public IPv6NetworkLink getFallbackLink() { + return fallbackLink; + } + + public void setFallbackLink(IPv6NetworkLink fallbackLink) { + this.fallbackLink = fallbackLink; + } + + private Map protocolNumberRegister = new ConcurrentHashMap<>(256 * 2); + + public Map getProtocolNumberRegister() { + return protocolNumberRegister; + } + + private List addressGroups =new ArrayList<>(); + + //new Inet6AddressGroup(loopbackAddress, 128) new Inet6AddressGroup((Inet6Address) Inet6Address.getByName("::1"), 128) + public LoopbackIPv6NetworkLink(List addressGroupsx,SRv6Router router) { + this.addressGroups .addAll( addressGroupsx); + } + + public Consumer getReceiveConsumer() { + return receiveConsumer; + } + + private Consumer receiveConsumer; + private Consumer rerouteConsumer; + private SRv6Router router; + + @Override + public void sendPacket(IPv6Packet pack, Inet6Address next) throws IOException { + PacketConsumer pcm= protocolNumberRegister.get(pack.getPayload().getProtocolNumber()); + if (pcm != null) { + if(!pcm.accept(pack)) { + if(fallbackLink!=null) { + fallbackLink.sendPacket(pack, next); + } + } + }else { + if(fallbackLink!=null) { + fallbackLink.sendPacket(pack, next); + } + } + } + + @Override + public boolean isLoopBack() { + return true; + } + + @Override + public List getNeighborsInfo() { + List hs = new ArrayList<>(); + return hs; + } + + @Override + public boolean isCongress(IPv6Packet iPv6Packet, double scale) { + return false; + } + + @Override + public String getName() { + return "inLoopBack"; + } + + @Override + public boolean isUp() { + return true; + } + + @Override + public void setReceiveConsumer(Consumer con) { + this.receiveConsumer = con; + if(fallbackLink!=null) { + fallbackLink.setReceiveConsumer(con); + } + } + + @Override + public List getAddressGroups() { + return addressGroups; + } + + @Override + public void setRerouteConsumer(Consumer rerouteConsumer) { + this.rerouteConsumer=rerouteConsumer; + if(fallbackLink!=null) { + fallbackLink.setRerouteConsumer(rerouteConsumer); + } + } + + public Consumer getRerouteConsumer() { + return rerouteConsumer; + } + + @Override + public List getRouteItems() { + List rlist = new ArrayList<>(); + for(Inet6AddressGroup group:addressGroups) { + rlist.add(new RouteItem(new Inet6AddressGroup(group.getAddress(), 128), + group.getAddress(), this, "Direct", 0, 0, null, "D", true)); + } + + for (Iterator iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext();) { + Neighbor addresses = (Neighbor) iteratorx.next(); + RouteItem ri = new RouteItem(new Inet6AddressGroup(addresses.getAddress().getAddress(), 128), + addresses.getAddress().getAddress(), this, "Direct", 0, 128, addresses.getMonitor(), "D", + false); + rlist.add(ri); + + RouteItem ris = new RouteItem(addresses.getLocator(), + (Inet6Address) addresses.getLocator().getAddress(), this, "KLALB SRv6", 13, 128, + addresses.getMonitor(), "D", false); + rlist.add(ris); + + } + return rlist; + } + + @Override + public boolean isReachSpeedLimit(IPv6Packet iPv6Packet) { + return false; + } + + public SRv6Router getRouter() { + return router; + } + + public void setRouter(SRv6Router router) { + this.router = router; + } + + @Override + public void setCongressCondition(Lock lock, Condition condition) { + // TODO 自动生成的方法存根 + + } + + + + }; \ No newline at end of file diff --git a/src/org/kne/cloud/network/ipv6/Neighbor.java b/src/org/kne/cloud/network/ipv6/Neighbor.java index bdd53b3..0a42976 100644 --- a/src/org/kne/cloud/network/ipv6/Neighbor.java +++ b/src/org/kne/cloud/network/ipv6/Neighbor.java @@ -32,9 +32,9 @@ public class Neighbor { this.locator = locator; this.monitor = monitor; } - public Neighbor(Inet6AddressGroup peerAddress, Inet6AddressGroup remoteVaddr, QueueingMonitorDataImpl monitor2, + public Neighbor(Inet6AddressGroup address, Inet6AddressGroup locator, MonitorData monitor2, BandwidthDistributer bandwidthDistributer) { - this(peerAddress,remoteVaddr,monitor2); + this(address,locator,monitor2); this.bandwidthDistributer=bandwidthDistributer; } @Override diff --git a/src/org/kne/cloud/network/ipv6/Pad1HopByHopTLV.java b/src/org/kne/cloud/network/ipv6/Pad1HopByHopTLV.java new file mode 100644 index 0000000..0eb94fa --- /dev/null +++ b/src/org/kne/cloud/network/ipv6/Pad1HopByHopTLV.java @@ -0,0 +1,26 @@ +package org.kne.cloud.network.ipv6; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; + +import org.kne.cloud.network.srv6.IPv6SegmentRoutingTLV; + +/** + * Pad1 Hop-by-Hop TLV - 没有数据部分 + */ +public class Pad1HopByHopTLV extends IPv6HopByHopTLV { + public Pad1HopByHopTLV() { + super(IPv6HopByHopTLV.PAD1); + } + + public Pad1HopByHopTLV(ByteBuffer klalbHeader) { + super(klalbHeader); + } + + @Override + public String toString() { + return "Pad1HopByHopTLV []"; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ipv6/PadNHopByHopTLV.java b/src/org/kne/cloud/network/ipv6/PadNHopByHopTLV.java new file mode 100644 index 0000000..fa946d3 --- /dev/null +++ b/src/org/kne/cloud/network/ipv6/PadNHopByHopTLV.java @@ -0,0 +1,30 @@ +package org.kne.cloud.network.ipv6; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; + +import org.kne.cloud.network.srv6.IPv6SegmentRoutingTLV; + +/** + * PadN Hop-by-Hop TLV - 有数据部分 + */ +public class PadNHopByHopTLV extends IPv6HopByHopTLV { + public PadNHopByHopTLV(ByteBuffer klalbHeader) { + super(klalbHeader); + } + + public PadNHopByHopTLV(int dataLength) { + super(PadNHopByHopTLV.PADN); + getData().limit(dataLength); + } + + @Override + public String toString() { + return "PadNHopByHopTLV [getDataLength()=" + getDataLength() + "]"; + } + + + // 继承的readFromChannel和writeToChannel会正确处理数据部分 +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ipv6/TLV.java b/src/org/kne/cloud/network/ipv6/TLV.java index 1ad6d81..2fcc4d6 100644 --- a/src/org/kne/cloud/network/ipv6/TLV.java +++ b/src/org/kne/cloud/network/ipv6/TLV.java @@ -11,7 +11,32 @@ import org.kne.cloud.network.NetworkPacket; public class TLV extends NetworkPacket{ private int headerLength=2; - + +public static final int PAD1=0; + public TLV(ByteBuffer header, boolean isDefault) { + this.header=header; + this.isDefault=isDefault; + if(getType()==PAD1) + setHeaderLength(1); + if(isDefault&&(getHeaderLength()>1)) { + data=NetworkPacket.bufferAllocator.allocate(512); + } +} + + public TLV(int type, boolean isDefault) { + if(type==PAD1) { + setHeaderLength(1); + } + this.header=NetworkPacket.bufferAllocator.allocate(getHeaderLength()); + this.isDefault=isDefault; + header.put((byte) type); + header.put((byte) 0); + header.flip(); + if(isDefault&&(getHeaderLength()>1)) { + data=NetworkPacket.bufferAllocator.allocate(512); + } + } + public int getHeaderLength() { return headerLength; } @@ -29,30 +54,31 @@ private int headerLength=2; } @Override - public long getLength() { - return headerLength+(isDefault?data.limit():0); + public long getTotalLength() { + return getHeaderLength()+(isDefault?data.limit():0); } @Override public void writeToChannel(WritableByteChannel dto) throws IOException { - if(isDefault&&(headerLength>1)) { - setDataLength(data.limit()); - } - header.limit(headerLength); - dto.write(header.slice(0,header.limit())); - if(isDefault&&(headerLength>1)) { - dto.write(data.slice(0, data.limit())); - } + if(isDefault&&(getHeaderLength()>1)) { + setDataLength(data.limit()); + } + header.limit(getHeaderLength()); + dto.write(header.slice(0,header.limit())); + if(isDefault&&(getHeaderLength()>1)) { + dto.write(data.slice(0, data.limit())); + } } @Override public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + header.limit(1); while (header.hasRemaining()) { if (din.read(header) == -1) { throw new EOFException(); } } - if(headerLength>1) { + if(getHeaderLength()>1) { header.limit(2); while (header.hasRemaining()) { if (din.read(header) == -1) { @@ -62,7 +88,7 @@ private int headerLength=2; } header.flip(); - if(isDefault&&(headerLength>1)) { + if(isDefault&&(getHeaderLength()>1)) { data.clear(); data.limit(getDataLength()); while(data.hasRemaining()){ @@ -93,4 +119,14 @@ private int headerLength=2; public void setDataLength(int dataLength) { header.put(1,(byte) dataLength); } + + public void setHeaderLength(int headerLength) { + this.headerLength = headerLength; + } + + @Override + public String toString() { + return "TLV [getType()=" + getType() + ", getDataLength()=" + getDataLength() + "]"; + } + } diff --git a/src/org/kne/cloud/network/klalb/ACKTPacket.java b/src/org/kne/cloud/network/klalb/ACKTPacket.java index 8b78f56..2293934 100644 --- a/src/org/kne/cloud/network/klalb/ACKTPacket.java +++ b/src/org/kne/cloud/network/klalb/ACKTPacket.java @@ -33,10 +33,10 @@ public class ACKTPacket extends KLALBPacket implements PortPacket { @Override public String toString() { - return "ACKT "+getSport()+"->"+getDport()+" "+getNumber()+"[] avaliable:"+getAvaliableRcvWindow(); + return "ACKT "+getSrcPort()+"->"+getDstPort()+" "+getNumber()+"[] avaliable:"+getAvaliableRcvWindow(); } - public int getSport() { + public int getSrcPort() { return klalbHeader.getInt(1); } @@ -44,7 +44,7 @@ public class ACKTPacket extends KLALBPacket implements PortPacket { return klalbHeader.get(26)!=0; } - public int getDport() { + public int getDstPort() { return klalbHeader.getInt(5); } diff --git a/src/org/kne/cloud/network/klalb/ADDLINESPacket.java b/src/org/kne/cloud/network/klalb/ADDLINESPacket.java index 1b4b8aa..389df2b 100644 --- a/src/org/kne/cloud/network/klalb/ADDLINESPacket.java +++ b/src/org/kne/cloud/network/klalb/ADDLINESPacket.java @@ -63,7 +63,7 @@ public class ADDLINESPacket extends KLALBPacket { } @Override - public long getLength() { + public long getTotalLength() { return HEADER_LENGTH+lines.getBytes(Charset.forName("UTF-8")).length; } diff --git a/src/org/kne/cloud/network/klalb/AbstractKLALBPacketLink.java b/src/org/kne/cloud/network/klalb/AbstractKLALBPacketLink.java index 632cec7..2f932bd 100644 --- a/src/org/kne/cloud/network/klalb/AbstractKLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/AbstractKLALBPacketLink.java @@ -3,7 +3,9 @@ package org.kne.cloud.network.klalb; import java.io.IOException; import java.net.SocketException; import java.nio.ByteBuffer; +import java.util.List; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; import org.kne.cloud.network.NetworkPacket; import org.kne.io.KNEChannels; @@ -19,76 +21,83 @@ public abstract class AbstractKLALBPacketLink implements KLALBPacketLink { AbstractKLALBPacketLink.defaultSoTimeout = defaultSoTimeout; } - private AtomicLong[] inputTrafficCounters; - private AtomicLong[] outputTrafficCounters; - private AtomicLong[] inputPacketsCounters; - private AtomicLong[] outputPacketsCounters; + private LongAdder[] inputTrafficCounters; + private LongAdder[] outputTrafficCounters; + private LongAdder[] inputPacketsCounters; + private LongAdder[] outputPacketsCounters; @Override - public void setOutputPacketsCounters(AtomicLong[] outCounter) { + public void setOutputPacketsCounters(LongAdder[] outCounter) { outputPacketsCounters=outCounter; } @Override - public void setInputPacketsCounters(AtomicLong[] inCounter) { + public void setInputPacketsCounters(LongAdder[] inCounter) { inputPacketsCounters=inCounter; } @Override - public void setOutputTrafficCounters(AtomicLong[] outCounter) { + public void setOutputTrafficCounters(LongAdder[] outCounter) { this.outputTrafficCounters=outCounter; } @Override - public void setInputTrafficCounters(AtomicLong[] inCounter) { + public void setInputTrafficCounters(LongAdder[] inCounter) { this.inputTrafficCounters=inCounter; } - public AtomicLong[] getInputTrafficCounters() { + public LongAdder[] getInputTrafficCounters() { return inputTrafficCounters; } - public AtomicLong[] getOutputTrafficCounters() { + public LongAdder[] getOutputTrafficCounters() { return outputTrafficCounters; } - public AtomicLong[] getInputPacketsCounters() { + public LongAdder[] getInputPacketsCounters() { return inputPacketsCounters; } - public AtomicLong[] getOutputPacketsCounters() { + public LongAdder[] getOutputPacketsCounters() { return outputPacketsCounters; } protected void incOutput(int packetLength) { if(outputTrafficCounters!=null) { - for(AtomicLong al:outputTrafficCounters) { - al.addAndGet(packetLength); + for(LongAdder al:outputTrafficCounters) { + al.add(packetLength); } } if(outputPacketsCounters!=null) { - for(AtomicLong al:outputPacketsCounters) { - al.incrementAndGet(); + for(LongAdder al:outputPacketsCounters) { + al.add(1); } } } protected void incInput(int packetLength) { if(inputTrafficCounters!=null) { - for(AtomicLong al:inputTrafficCounters) { - al.addAndGet(packetLength); + for(LongAdder al:inputTrafficCounters) { + al.add(packetLength); } } if(inputPacketsCounters!=null) { - for(AtomicLong al:inputPacketsCounters) { - al.incrementAndGet(); + for(LongAdder al:inputPacketsCounters) { + al.add(1); } } } + @Override + public void writeKLALBPackets(List kps) throws IOException { + for(KLALBPacket pack:kps) { + writeKLALBPacket(pack); + } + } + @Override public void writeKLALBPacket(KLALBPacket kp) throws IOException { - ByteBuffer dataWrite=NetworkPacket.bufferAllocator.allocate((int) kp.getLength()); - //dataWrite.clear(); + ByteBuffer dataWrite=NetworkPacket.bufferAllocator.allocate((int) kp.getTotalLength()); + dataWrite.clear(); KLALBPacket.writeKLALBPacketToChannel(KNEChannels.newWritableChannel( dataWrite), kp); dataWrite.flip(); writePacket(dataWrite); diff --git a/src/org/kne/cloud/network/klalb/BWINFPacket.java b/src/org/kne/cloud/network/klalb/BWINFPacket.java index 6bc02b8..03d7c82 100644 --- a/src/org/kne/cloud/network/klalb/BWINFPacket.java +++ b/src/org/kne/cloud/network/klalb/BWINFPacket.java @@ -20,8 +20,8 @@ public class BWINFPacket extends KLALBPacket { } @Override - public long getLength() { - return super.getLength()+16; + public long getTotalLength() { + return super.getTotalLength(); } public BWINFPacket(long upSpeed,long downSpeed) { diff --git a/src/org/kne/cloud/network/klalb/BindableKLALBPacketConsumer.java b/src/org/kne/cloud/network/klalb/BindableKLALBPacketConsumer.java index 95b9a98..913d48e 100644 --- a/src/org/kne/cloud/network/klalb/BindableKLALBPacketConsumer.java +++ b/src/org/kne/cloud/network/klalb/BindableKLALBPacketConsumer.java @@ -3,7 +3,7 @@ package org.kne.cloud.network.klalb; import java.net.InetAddress; import java.net.ServerSocket; -public interface BindableKLALBPacketConsumer extends KLALBPacketConsumer { +public interface BindableKLALBPacketConsumer extends PacketConsumer { public InetAddress getRemoteInetAddress() ; public InetAddress getLocalInetAddress() ; public int getPort() ; diff --git a/src/org/kne/cloud/network/klalb/CONST.java b/src/org/kne/cloud/network/klalb/CONST.java index eef23b2..31fc93a 100644 --- a/src/org/kne/cloud/network/klalb/CONST.java +++ b/src/org/kne/cloud/network/klalb/CONST.java @@ -2,7 +2,7 @@ package org.kne.cloud.network.klalb; public class CONST { public static final String klalb="KLALB"; - public static final String klalbver="3.2"; + public static final String klalbver="3.4"; public static final int bversion=3; public static final int sversion=1; public static final int itemwidth = 720; diff --git a/src/org/kne/cloud/network/klalb/DATATPacket.java b/src/org/kne/cloud/network/klalb/DATATPacket.java index 833e786..2b321fe 100644 --- a/src/org/kne/cloud/network/klalb/DATATPacket.java +++ b/src/org/kne/cloud/network/klalb/DATATPacket.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; +import java.util.Arrays; import org.kne.cloud.network.NetworkPacket; @@ -17,7 +18,7 @@ public class DATATPacket extends KLALBPacket implements PortPacket{ private static final int HEADER_LENGTH=20; @Override - public long getLength() { + public long getTotalLength() { return HEADER_LENGTH+dataBuffer.limit(); } volatile long resendtimer=System.nanoTime(); @@ -54,11 +55,11 @@ public class DATATPacket extends KLALBPacket implements PortPacket{ super(bb,HEADER_LENGTH); } - public int getSport() { + public int getSrcPort() { return klalbHeader.getInt(1); } - public int getDport() { + public int getDstPort() { return klalbHeader.getInt(5); } @@ -75,7 +76,9 @@ public class DATATPacket extends KLALBPacket implements PortPacket{ @Override public String toString() { - return "DATAT "+getSport()+"->"+getDport()+" "+getNumber()+"["+getSize()+"]"; + byte[]b=new byte[Math.min(dataBuffer.limit(),10)]; + dataBuffer.get(0, b); + return "DATAT "+getSrcPort()+"->"+getDstPort()+" "+getNumber()+"["+getSize()+"] "+Arrays.toString(b); } @Override diff --git a/src/org/kne/cloud/network/klalb/IPSequence.java b/src/org/kne/cloud/network/klalb/IPSequence.java index 89fa913..1e7433b 100644 --- a/src/org/kne/cloud/network/klalb/IPSequence.java +++ b/src/org/kne/cloud/network/klalb/IPSequence.java @@ -30,7 +30,10 @@ public class IPSequence { } @Override public int hashCode() { - return Objects.hash(uuid); + final int prime = 31; + int result = 1; + result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); + return result; } @Override public boolean equals(Object obj) { @@ -41,7 +44,12 @@ public class IPSequence { if (getClass() != obj.getClass()) return false; IPSequence other = (IPSequence) obj; - return Objects.equals(uuid, other.uuid); + if (uuid == null) { + if (other.uuid != null) + return false; + } else if (!uuid.equals(other.uuid)) + return false; + return true; } } diff --git a/src/org/kne/cloud/network/klalb/IPv6OverKLALBPacket.java b/src/org/kne/cloud/network/klalb/IPv6OverKLALBPacket.java index 2c18c92..9fa0f9f 100644 --- a/src/org/kne/cloud/network/klalb/IPv6OverKLALBPacket.java +++ b/src/org/kne/cloud/network/klalb/IPv6OverKLALBPacket.java @@ -13,15 +13,15 @@ public class IPv6OverKLALBPacket extends KLALBPacket { @Override - public long getLength() { - return HEADER_LENGTH+ipv6Packet.getLength(); + public long getTotalLength() { + return HEADER_LENGTH+ipv6Packet.getTotalLength(); } private IPv6Packet ipv6Packet; public IPv6OverKLALBPacket(IPv6Packet ipv6Packet) { super(IPV6OVERKLALB,HEADER_LENGTH); - klalbHeader.putLong((int) ipv6Packet.getLength()); + klalbHeader.putLong((int) ipv6Packet.getTotalLength()); this.ipv6Packet=ipv6Packet; } @@ -41,19 +41,28 @@ public class IPv6OverKLALBPacket extends KLALBPacket { return ipv6Packet; } - @Override + /*@Override public String toString() { - return "IPv6 "+ipv6Packet.getSourceAddress().getHostAddress()+"->"+ipv6Packet.getDestinationAddress().getHostAddress()+" type:"+ipv6Packet.getPayload().getProtocolNumber()+"["+getSize()+"]"; - } + return "IPv6OverKLALBPacket "+ipv6Packet.getSourceAddress().getHostAddress()+"->"+ipv6Packet.getDestinationAddress().getHostAddress()+" type:"+ipv6Packet.getPayload().getProtocolNumber()+"["+getSize()+"]"; + }*/ + + public long getSize() { - return ipv6Packet.getLength(); + return ipv6Packet.getTotalLength(); } + @Override + public String toString() { + return "IPv6OverKLALBPacket [ipv6Packet=" + ipv6Packet + "]"; + } + + + @Override public void writeToChannel(WritableByteChannel dto) throws IOException { - klalbHeader.putLong(1, ipv6Packet.getLength()); + klalbHeader.putLong(1, ipv6Packet.getTotalLength()); super.writeToChannel(dto); ipv6Packet.writeToChannel(dto); } diff --git a/src/org/kne/cloud/network/klalb/KLALBConfig.java b/src/org/kne/cloud/network/klalb/KLALBConfig.java index 756e059..d31e91f 100644 --- a/src/org/kne/cloud/network/klalb/KLALBConfig.java +++ b/src/org/kne/cloud/network/klalb/KLALBConfig.java @@ -32,7 +32,7 @@ import java.io.FileNotFoundException; public class KLALBConfig extends ArrayList{ public static void main(String[] args) throws UnknownHostException, JsonSyntaxException, JsonIOException, FileNotFoundException { - GsonBuilder gb=new GsonBuilder(); + GsonBuilder gb=new GsonBuilder().setPrettyPrinting(); MultipurposeSocketAddress.registerToGsonBuilder(gb); KLALBConfigItem.registerToGsonBuilder(gb); Gson gson=gb.create(); diff --git a/src/org/kne/cloud/network/klalb/KLALBController.java b/src/org/kne/cloud/network/klalb/KLALBController.java index 312d9be..1baad1e 100644 --- a/src/org/kne/cloud/network/klalb/KLALBController.java +++ b/src/org/kne/cloud/network/klalb/KLALBController.java @@ -43,6 +43,7 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; import org.kne.cloud.clock.AdjustedNanoClock; +import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.network.IPMulticastDiscovery; import org.kne.cloud.network.MultipurposeSocketAddress; import org.kne.cloud.network.PortPair; @@ -54,11 +55,24 @@ import org.kne.cloud.network.ipv6.IPv6Packet.IPv6ExtHeader; import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload; import org.kne.cloud.network.ipv6.IPv6TUNLoopbackNetworkLink; import org.kne.cloud.network.ipv6.Inet6AddressGroup; +import org.kne.cloud.network.ipv6.LoopbackIPv6NetworkLink; +import org.kne.cloud.network.ipv6.Neighbor; import org.kne.cloud.network.monitor.MonitorData; import org.kne.cloud.network.monitor.SpeedAndTrafficMonitorDataImpl; +import org.kne.cloud.network.monitor.TimestampMonitor; +import org.kne.cloud.network.ntp.NTPContext; +import org.kne.cloud.network.ntp.NTPv4Packet; +import org.kne.cloud.network.ntp.NTPv4Protocol; +import org.kne.cloud.network.ntp.NTPv4Protocol.NTPPeer; +import org.kne.cloud.network.srv6.JsonDataPacket; import org.kne.cloud.network.srv6.KLALBRoutingProtocol; +import org.kne.cloud.network.srv6.KLALBRoutingProtocolAPIClient; +import org.kne.cloud.network.srv6.KLALBRoutingProtocolAPIServer; +import org.kne.cloud.network.srv6.KLALBRoutingProtocolJsonData; import org.kne.cloud.network.srv6.PacketConsumer; import org.kne.cloud.network.srv6.SRv6Router; +import org.kne.cloud.network.srv6.SRv6RouterListener; +import org.kne.cloud.network.tcp.UDPPacket; import org.kne.cloud.network.te.BandwidthDistributer; import org.kne.cloud.network.te.DWRRLoadingBalanceAlgorithm; import org.kne.concurrent.DisruptorExecutor; @@ -66,239 +80,314 @@ import org.kne.concurrent.HighPerformanceExecutor; import org.kne.io.KNEChannels; import org.pcap4j.packet.IpV6Packet.IpV6Header; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; public class KLALBController { - - private SpeedAndTrafficMonitorDataImpl linkMonitor=new SpeedAndTrafficMonitorDataImpl(); + //TimestampMonitor<> - private SpeedAndTrafficMonitorDataImpl datatMonitor=new SpeedAndTrafficMonitorDataImpl(); + private SpeedAndTrafficMonitorDataImpl linkMonitor = new SpeedAndTrafficMonitorDataImpl(); + + private SpeedAndTrafficMonitorDataImpl datatMonitor = new SpeedAndTrafficMonitorDataImpl(); + + private List selflineTable = new ArrayList<>(); - private ListselflineTable=new ArrayList<>(); - private static final boolean showpacket = false; - private static final int PREFIX = 128;//112 - private static final int DISCOVERY_PORT=4569; - - private static List ipmd=new ArrayList<>(); - - private ListdnsAddresses=new ArrayList<>(); - + private static final int PREFIX = 128;// 112 + private static final int DISCOVERY_PORT = 4569; + + private static List ipmd = new ArrayList<>(); + + private List networkInterfaceExcept = new ArrayList<>(); + + public List getNetworkInterfaceExcept() { + return networkInterfaceExcept; + } + + private List dnsAddresses = new ArrayList<>(); + public List getDnsAddresses() { return dnsAddresses; } - private Timer twk=new Timer("网卡检测扫描计时器", true); - { - - twk.schedule(new TimerTask() { - + private Timer twk = new Timer("网卡检测扫描计时器", true); + + + private TimerTask tsk1=new TimerTask() { + @Override public void run() { - + try { - - - - Enumerationeu= NetworkInterface.getNetworkInterfaces(); + + Enumeration eu = NetworkInterface.getNetworkInterfaces(); while (eu.hasMoreElements()) { NetworkInterface networkInterface = (NetworkInterface) eu.nextElement(); - if(networkInterface.getDisplayName().startsWith(IPv6TUNLoopbackNetworkLink.KLALB_DECENTRALIZED_S_RV6_NETWORK)) { + + if (networkInterface.getDisplayName() + .startsWith(IPv6TUNLoopbackNetworkLink.KLALB_DECENTRALIZED_S_RV6_NETWORK)) { continue; } - if(networkInterface.isUp()) { - //System.out.println(networkInterface+" "+networkInterface.isUp()); - Enumerationei= networkInterface.getInetAddresses(); - while (ei.hasMoreElements()) { - InetAddress inetAddress = (InetAddress) ei.nextElement(); - if(!inetAddress.isLoopbackAddress()) - for (Iterator iterator = listens.iterator(); iterator.hasNext();) { - MultipurposeSocketAddress tcpl = (MultipurposeSocketAddress) iterator.next(); - - try { - if(tcpl.getInetAddress().isAnyLocalAddress()||tcpl.getInetAddress().equals(inetAddress)) { - MultipurposeSocketAddress bind=new MultipurposeSocketAddress(tcpl.getType(),inetAddress.getHostAddress(),tcpl.getPort()); - //System.out.println(bind); - synchronized (selflineTable) { - if(!selflineTable.contains(bind)) { - selflineTable.add(bind); - } -} - } - } catch (UnknownHostException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } - - - } + if (networkInterfaceExcept.contains(networkInterface)) { + continue; } - - + if (networkInterface.isUp()) { + // System.out.println(networkInterface+" "+networkInterface.isUp()); + Enumeration ei = networkInterface.getInetAddresses(); + while (ei.hasMoreElements()) { + InetAddress inetAddress = (InetAddress) ei.nextElement(); + if (!inetAddress.isLoopbackAddress()) + for (Iterator iterator = listens.iterator(); iterator + .hasNext();) { + MultipurposeSocketAddress tcpl = (MultipurposeSocketAddress) iterator.next(); + + try { + if (tcpl.getInetAddress().isAnyLocalAddress() + || tcpl.getInetAddress().equals(inetAddress)) { + MultipurposeSocketAddress bind = new MultipurposeSocketAddress( + tcpl.getType(), inetAddress.getHostAddress(), tcpl.getPort()); + // System.out.println(bind); + synchronized (selflineTable) { + if (!selflineTable.contains(bind)) { + selflineTable.add(bind); + } + } + } + } catch (UnknownHostException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } + + } + } + } } } catch (SocketException e) { } - lineslock.writeLock().lock(); + lineslock.writeLock().lock(); try { - - Listlocaladdress=new ArrayList<>(); - Enumerationeu= NetworkInterface.getNetworkInterfaces(); + + List localaddress = new ArrayList<>(); + Enumeration eu = NetworkInterface.getNetworkInterfaces(); while (eu.hasMoreElements()) { NetworkInterface networkInterface = (NetworkInterface) eu.nextElement(); - if(networkInterface.isUp()) { - //System.out.println(networkInterface+" "+networkInterface.isUp()); - Enumerationei= networkInterface.getInetAddresses(); - while (ei.hasMoreElements()) { - InetAddress inetAddress = (InetAddress) ei.nextElement(); - MultipurposeSocketAddress bind=new MultipurposeSocketAddress(inetAddress.getHostAddress(),0); - localaddress.add(bind); - - } + if (networkInterface.isUp()) { + // System.out.println(networkInterface+" "+networkInterface.isUp()); + Enumeration ei = networkInterface.getInetAddresses(); + while (ei.hasMoreElements()) { + InetAddress inetAddress = (InetAddress) ei.nextElement(); + MultipurposeSocketAddress bind = new MultipurposeSocketAddress( + inetAddress.getHostAddress(), 0); + localaddress.add(bind); + + } } } - Setst=new HashSet<>(); - for (Iterator iterator = lines.iterator(); iterator.hasNext();) { - KLALBRemoteLine multipurposeSocketAddress = (KLALBRemoteLine) iterator.next(); - if(multipurposeSocketAddress.getSocketAddress()!=null) - st.add(multipurposeSocketAddress.getSocketAddress()); + Set st = new HashSet<>(); + for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { + IPv6NetworkLink link=iterator.next(); + if(link instanceof KLALBRemoteLine) { + KLALBRemoteLine multipurposeSocketAddress = (KLALBRemoteLine) link; + if (multipurposeSocketAddress.getSocketAddress() != null) + st.add(multipurposeSocketAddress.getSocketAddress()); + } } - - + for (Iterator iterator = st.iterator(); iterator.hasNext();) { - MultipurposeSocketAddress target = (MultipurposeSocketAddress) iterator - .next(); + MultipurposeSocketAddress target = (MultipurposeSocketAddress) iterator.next(); addRemoteLines(target); - /*for (Iterator iterator2 = localaddress.iterator(); iterator2.hasNext();) { - MultipurposeSocketAddress bind = (MultipurposeSocketAddress) iterator2 - .next(); - try { - if(target.getInetAddress().isLoopbackAddress() &&(!bind.getInetAddress().isLoopbackAddress())) { - continue; - } - if((!target.getInetAddress().isLoopbackAddress()) &&bind.getInetAddress().isLoopbackAddress()) { - continue; - } - if(target.getInetAddress()instanceof Inet4Address&&bind.getInetAddress() instanceof Inet6Address) { - continue; - } - if(target.getInetAddress() instanceof Inet6Address &&bind.getInetAddress() instanceof Inet4Address) { - continue; - } - } catch (UnknownHostException e) { - if(e.getMessage().toLowerCase().contains("no scope_id found")) - } - if(!checkContainsTargetAndBind(target,bind)) { - //System.out.println(target+" "+bind); - addRemoteLine( new KLALBRemoteLine(target,bind)); - } - }*/ - + /* + * for (Iterator iterator2 = localaddress.iterator(); + * iterator2.hasNext();) { MultipurposeSocketAddress bind = + * (MultipurposeSocketAddress) iterator2 .next(); try { + * if(target.getInetAddress().isLoopbackAddress() + * &&(!bind.getInetAddress().isLoopbackAddress())) { continue; } + * if((!target.getInetAddress().isLoopbackAddress()) + * &&bind.getInetAddress().isLoopbackAddress()) { continue; } + * if(target.getInetAddress()instanceof Inet4Address&&bind.getInetAddress() + * instanceof Inet6Address) { continue; } if(target.getInetAddress() instanceof + * Inet6Address &&bind.getInetAddress() instanceof Inet4Address) { continue; } } + * catch (UnknownHostException e) { + * if(e.getMessage().toLowerCase().contains("no scope_id found")) } + * if(!checkContainsTargetAndBind(target,bind)) { + * //System.out.println(target+" "+bind); addRemoteLine( new + * KLALBRemoteLine(target,bind)); } } + */ + } - for (Iterator iterator = lines.iterator(); iterator.hasNext();) { - KLALBRemoteLine reml = (KLALBRemoteLine) iterator - .next(); - if(reml.getSocketAddress()!=null) { - if(reml.getBindAddress()!=null||reml.getRemoteVaddr()!=null) - if(!localaddress.contains(reml.getBindAddress())) { - reml.close(); - lines.remove(reml); + for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { + IPv6NetworkLink link=iterator.next(); + if(link instanceof KLALBRemoteLine) { + KLALBRemoteLine reml = (KLALBRemoteLine) link; + if (reml.getSocketAddress() != null) { + if (reml.getBindAddress() != null || reml.getRemoteVaddr() != null) + if (!localaddress.contains(reml.getBindAddress())) { + reml.close(); + srv6Router.getLinkTabel().remove(reml); + } } } } - + for (Iterator iterator = ipmd.iterator(); iterator.hasNext();) { IPMulticastDiscovery ipMulticastDiscovery = (IPMulticastDiscovery) iterator.next(); - if(ipMulticastDiscovery.isClosed()||(!ipMulticastDiscovery.getNinterface().isUp())) { + if (ipMulticastDiscovery.isClosed() || (!ipMulticastDiscovery.getNinterface().isUp())) { iterator.remove(); try { ipMulticastDiscovery.close(); } catch (IOException e) { e.printStackTrace(); } - System.out.println("移除网卡:"+ipMulticastDiscovery.getNinterface()); + System.out.println("移除网卡:" + ipMulticastDiscovery.getNinterface()); } } - Enumerationeu2= NetworkInterface.getNetworkInterfaces(); + Enumeration eu2 = NetworkInterface.getNetworkInterfaces(); while (eu2.hasMoreElements()) { NetworkInterface networkInterface = (NetworkInterface) eu2.nextElement(); - if(networkInterface.getDisplayName().startsWith(IPv6TUNLoopbackNetworkLink.KLALB_DECENTRALIZED_S_RV6_NETWORK)) { + if (networkInterface.getDisplayName() + .startsWith(IPv6TUNLoopbackNetworkLink.KLALB_DECENTRALIZED_S_RV6_NETWORK)) { continue; } - if(networkInterface.isUp()) { - - Enumerationei= networkInterface.getInetAddresses(); - loop:while (ei.hasMoreElements()) { - InetAddress bidr = (InetAddress) ei.nextElement(); - - for (Iterator iterator = ipmd.iterator(); iterator.hasNext();) { - IPMulticastDiscovery ipMulticastDiscovery = (IPMulticastDiscovery) iterator.next(); - if(networkInterface.equals(ipMulticastDiscovery.getNinterface())&&bidr.equals(ipMulticastDiscovery.getBind().getAddress())) { - continue loop; - } - } - - - - try { - //InetAddress bidr=InetAddress.getByName("::0"); - if(bidr instanceof Inet6Address) { - IPMulticastDiscovery ipd=new IPMulticastDiscovery(new InetSocketAddress(bidr,DISCOVERY_PORT), new InetSocketAddress(InetAddress.getByName("ff02::2486"),DISCOVERY_PORT), networkInterface,selflineTable,10000L); - ipd.setCon((mpa)->{ - //System.out.println("添加本地IPv6链路:"+mpa); - try { - if(!checkIsSelf(mpa)) - addRemoteLines(mpa); - } catch (UnknownHostException e) { + if (networkInterfaceExcept.contains(networkInterface)) { + continue; + } + + if (networkInterface.isUp()) { + + Enumeration ei = networkInterface.getInetAddresses(); + loop: while (ei.hasMoreElements()) { + InetAddress bidr = (InetAddress) ei.nextElement(); + + for (Iterator iterator = ipmd.iterator(); iterator.hasNext();) { + IPMulticastDiscovery ipMulticastDiscovery = (IPMulticastDiscovery) iterator.next(); + if (networkInterface.equals(ipMulticastDiscovery.getNinterface()) + && bidr.equals(ipMulticastDiscovery.getBind().getAddress())) { + continue loop; } - }); - ipd.start(); - ipmd.add(ipd); - }else if(bidr instanceof Inet4Address) { - //bidr=InetAddress.getByName("0.0.0.0"); - IPMulticastDiscovery ipd2=new IPMulticastDiscovery(new InetSocketAddress(bidr,DISCOVERY_PORT), new InetSocketAddress(InetAddress.getByName("224.0.0.86"),DISCOVERY_PORT), networkInterface,selflineTable,10000L); - ipd2.setCon((mpa)->{ - //System.out.println("添加本地IPv4链路:"+mpa); - try { - if(!checkIsSelf(mpa)) - addRemoteLines(mpa); - } catch (UnknownHostException e) { + } + + try { + // InetAddress bidr=InetAddress.getByName("::0"); + + if (bidr instanceof Inet6Address) { + IPMulticastDiscovery ipd = new IPMulticastDiscovery( + new InetSocketAddress(bidr, DISCOVERY_PORT), + new InetSocketAddress(InetAddress.getByName("ff02::2486"), + DISCOVERY_PORT), + networkInterface, selflineTable, 10000L); + ipd.setCon((mpa) -> { + // System.out.println("添加本地IPv6链路:"+mpa); + try { + if (!checkIsSelf(mpa)) + addRemoteLines(mpa); + } catch (UnknownHostException e) { + } + }); + ipd.start(); + ipmd.add(ipd); + } else if (bidr instanceof Inet4Address) { + // bidr=InetAddress.getByName("0.0.0.0"); + IPMulticastDiscovery ipd2 = new IPMulticastDiscovery( + new InetSocketAddress(bidr, DISCOVERY_PORT), + new InetSocketAddress(InetAddress.getByName("224.0.0.86"), + DISCOVERY_PORT), + networkInterface, selflineTable, 10000L); + ipd2.setCon((mpa) -> { + // System.out.println("添加本地IPv4链路:"+mpa); + try { + if (!checkIsSelf(mpa)) + addRemoteLines(mpa); + } catch (UnknownHostException e) { + } + }); + ipd2.start(); + ipmd.add(ipd2); } - }); - ipd2.start(); - ipmd.add(ipd2); + System.out.println("添加网卡:" + networkInterface); + } catch (BindException e) { + // e.printStackTrace(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); } - System.out.println("添加网卡:"+networkInterface); - }catch(BindException e) { - //e.printStackTrace(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - - - } - //} + + } + // } } } - + } catch (SocketException e) { - }finally { + } finally { lineslock.writeLock().unlock(); } - } private boolean checkIsSelf(MultipurposeSocketAddress inetAddress) throws UnknownHostException { - - return inetAddress.getInetAddress().isAnyLocalAddress()||inetAddress.getInetAddress().isLoopbackAddress()||selflineTable.contains(inetAddress); + + return inetAddress.getInetAddress().isAnyLocalAddress() + || inetAddress.getInetAddress().isLoopbackAddress() || selflineTable.contains(inetAddress); } - }, 2000, 2000); - } + }; + + private TimerTask tsk2=new TimerTask() { + + @Override + public void run() { + + List nt=ntptable; + //System.out.println("srv6 ip"+nb); + if(nvc2!=null) { + Set sp=nvc2.getPeers(); + for (MultipurposeSocketAddress server : nt) { + sp.add(new NTPPeer(server, NTPv4Packet.NTP_CLIENT)); + + } + sp.removeIf((p)->{ + for (MultipurposeSocketAddress server : nt) { + if(server.equals(p.getAddress())) { + return false; + } + } + return true; + }); + } + } + }; + + + private TimerTask tsk3=new TimerTask() { + + @Override + public void run() { + if(srv6Router!=null&&routingProtocol!=null) { + Set nb=srv6Router.getLocators(); + for (Iterator iterator = nb.iterator(); iterator.hasNext();) { + Inet6AddressGroup neighbor = (Inet6AddressGroup) iterator.next(); + try { + InetSocketAddress iaddr= new InetSocketAddress( neighbor.getAddress(),KLALBRoutingProtocol.DEFAULT_PORT); + apiClient.requestOpenLines(iaddr,(v)->{ + ThreadTool.makeVDaemonThreadIfSupport("线路添加任务", () -> { + for (MultipurposeSocketAddress msa:v) { + // System.out.print(msa); + addRemoteLines(msa); + } + }).start(); + }); + } catch (IOException e) { + e.printStackTrace(); + } + + } + } + } + }; + + public SpeedAndTrafficMonitorDataImpl getLinkMonitor() { return linkMonitor; } @@ -307,246 +396,295 @@ public class KLALBController { return datatMonitor; } - private static ConcurrentHashMapclocks=new ConcurrentHashMap<>(); + private HighAccuracyClock clock; - protected AdjustedNanoClock getAdjustedClockByVaddr(Inet6Address vaddr) { - AdjustedNanoClock clk=clocks.get(vaddr); - if(clk==null) { - clk=new AdjustedNanoClock(); - clocks.put(vaddr, clk); + public HighAccuracyClock getClock() { + return clock; + } + + private SocketType streamSocketType = new KLALBStreamSocketType(); + + public class KLALBStreamSocketType extends SocketType { + + public KLALBStreamSocketType() { + super(new KLALBVirtualSocketFactory(KLALBController.this), + new KLALBVirtualServerSocketFactory(KLALBController.this), + new KLALBVirtualSocketChannelFactory(KLALBController.this), + new KLALBVirtualServerSocketChannelFactory(KLALBController.this)); } - return clk; + } + public SocketType getStreamSocketType() { + return streamSocketType; + } - - + private SocketType datagramSocketType = new KLALBDatagramSocketType(); - private SocketType socketType= new KLALBSocketType(); - - public class KLALBSocketType extends SocketType{ + public class KLALBDatagramSocketType extends SocketType { - public KLALBSocketType() { - super(new KLALBVirtualSocketFactory(KLALBController.this), new KLALBVirtualServerSocketFactory(KLALBController.this),new KLALBVirtualSocketChannelFactory(KLALBController.this), new KLALBVirtualServerSocketChannelFactory(KLALBController.this)); + public KLALBDatagramSocketType() { + super(new KLALBVirtualDatagramSocketFactory(KLALBController.this), + new KLALBVirtualDatagramServerSocketFactory(KLALBController.this)); + //new KLALBVirtualDatagramSocketChannelFactory(KLALBController.this), + //new KLALBVirtualDatagramServerSocketChannelFactory(KLALBController.this)); } - - } - public SocketType getSocketType() { - return socketType; + } - - - //private Supplier selflineTableSupplier=()->{return null;}; - - - /*public Supplier getSelflineTableSupplier() { - return selflineTableSupplier; + public SocketType getDatagramSocketType() { + return datagramSocketType; } - public void setSelflineTableSupplier(Supplier selflineTableSupplier) { - this.selflineTableSupplier = selflineTableSupplier; - }*/ + // private Supplier selflineTableSupplier=()->{return null;}; + + /* + * public Supplier getSelflineTableSupplier() { return + * selflineTableSupplier; } + * + * public void setSelflineTableSupplier(Supplier selflineTableSupplier) + * { this.selflineTableSupplier = selflineTableSupplier; } + */ public List getSelflineTable() { return selflineTable; } - - //private Inet6AddressGroup self; + // private Inet6AddressGroup self; public Inet6AddressGroup getSelf() { return srv6Router.getLocator(); } - private List lines=new CopyOnWriteArrayList<>(); - private ReadWriteLock lineslock=new ReentrantReadWriteLock(); - - public List getLines() { - return lines; + + private ReadWriteLock lineslock = new ReentrantReadWriteLock(); + + public List getLines() { + return srv6Router.getLinkTabel(); } - private PortBinder streamPortBinder=new PortBinder(this); + private PortBinder streamPortBinder = new PortBinder(this); - private PortBinder rawPortBinder=new PortBinder(this); + private PortBinder datagramPortBinder = new PortBinder(this); + private PortBinder rawPortBinder = new PortBinder(this); + protected PortBinder getStreamPortBinder() { return streamPortBinder; } - public PortBinder getRawPortBinder() { + protected PortBinder getDatagramPortBinder() { + return datagramPortBinder; + } + + protected PortBinder getRawPortBinder() { return rawPortBinder; } public void reconnectImmediately() { - for (Iterator iterator = lines.iterator(); iterator.hasNext();) { - KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next(); + for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { + IPv6NetworkLink val=iterator.next(); + if(val instanceof KLALBRemoteLine) { + + KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) val; klalbRemoteLine.reconnectImmediately(); } + } } - - private PacketReceiver prc=new PacketReceiver(); - private class PacketReceiver implements Consumer{ + + + private NTPv4Protocol nvc2; + + private KLALBRoutingProtocolAPIServer apiServer; + + private KLALBRoutingProtocolAPIClient apiClient; + + /*private PacketReceiver prc = new PacketReceiver(); + private class PacketReceiver implements Consumer { @Override - public void accept( KLALBPacket rec) { + public void accept(KLALBPacket rec) { switch (rec.getType()) { case KLALBPacket.ADDLINES: - ADDLINESPacket lpt=(ADDLINESPacket) rec; - String s=lpt.getLines(); - ThreadTool.makeVDaemonThreadIfSupport("线路添加任务", ()->{ - Scanner scn=new Scanner(s); - while(scn.hasNext()) { - String sn=scn.nextLine(); - MultipurposeSocketAddress msa= new MultipurposeSocketAddress(sn); + ADDLINESPacket lpt = (ADDLINESPacket) rec; + String s = lpt.getLines(); + ThreadTool.makeVDaemonThreadIfSupport("线路添加任务", () -> { + Scanner scn = new Scanner(s); + while (scn.hasNext()) { + String sn = scn.nextLine(); + MultipurposeSocketAddress msa = new MultipurposeSocketAddress(sn); addRemoteLines(msa); - - } + + } }).start(); break; default: break; - + } } - + }*/ + public void addRemoteLines(List select) { + for(MultipurposeSocketAddress target:select) { + addRemoteLines(target); + } } - - public List addRemoteLines(MultipurposeSocketAddress target) { + public List addRemoteLines(MultipurposeSocketAddress target) { lineslock.writeLock().lock(); - try { - Listadded=new ArrayList<>(); - try { - Enumerationeu= NetworkInterface.getNetworkInterfaces(); - while (eu.hasMoreElements()) { - NetworkInterface networkInterface = (NetworkInterface) eu.nextElement(); - if(networkInterface.isUp()) { - //System.out.println(networkInterface+" "+networkInterface.isUp()); - Enumerationei= networkInterface.getInetAddresses(); + try { + List added = new ArrayList<>(); + try { + Enumeration eu = NetworkInterface.getNetworkInterfaces(); + while (eu.hasMoreElements()) { + NetworkInterface networkInterface = (NetworkInterface) eu.nextElement(); + if (networkInterface.isUp()) { + // System.out.println(networkInterface+" "+networkInterface.isUp()); + Enumeration ei = networkInterface.getInetAddresses(); while (ei.hasMoreElements()) { InetAddress inetAddress = (InetAddress) ei.nextElement(); try { - MultipurposeSocketAddress bind=new MultipurposeSocketAddress(inetAddress.getHostAddress(),0); - try { - if(target.getInetAddress().isLoopbackAddress() &&(!bind.getInetAddress().isLoopbackAddress())) { - continue; + MultipurposeSocketAddress bind = new MultipurposeSocketAddress( + inetAddress.getHostAddress(), 0); + try { + if (target.getInetAddress().isLoopbackAddress() + && (!bind.getInetAddress().isLoopbackAddress())) { + continue; + } + if ((!target.getInetAddress().isLoopbackAddress()) + && bind.getInetAddress().isLoopbackAddress()) { + continue; + } + if (target.getInetAddress() instanceof Inet4Address + && bind.getInetAddress() instanceof Inet6Address) { + continue; + } + if (target.getInetAddress() instanceof Inet6Address + && bind.getInetAddress() instanceof Inet4Address) { + continue; + } + // System.out.println(target+"->"+bind); + } catch (UnknownHostException e) { + if (e.getMessage().trim().toLowerCase().contains("no scope_id found")) { + throw e; + } + // e.printStackTrace(); } - if((!target.getInetAddress().isLoopbackAddress()) &&bind.getInetAddress().isLoopbackAddress()) { - continue; + if (!checkContainsTargetAndBind(target, bind)) { + KLALBRemoteLine line = new KLALBRemoteLine(target, bind); + addRemoteLine(line); + added.add(line); } - if(target.getInetAddress()instanceof Inet4Address&&bind.getInetAddress() instanceof Inet6Address) { - continue; - } - if(target.getInetAddress() instanceof Inet6Address &&bind.getInetAddress() instanceof Inet4Address) { - continue; - } - //System.out.println(target+"->"+bind); } catch (UnknownHostException e) { - if(e.getMessage().trim().toLowerCase().contains("no scope_id found")) { - throw e; - } - //e.printStackTrace(); + } - if(!checkContainsTargetAndBind(target,bind)) { - KLALBRemoteLine line=new KLALBRemoteLine(target,bind); - addRemoteLine(line ); - added.add(line); - } - } catch (UnknownHostException e) { - - } - } } } - } catch (SocketException e) { - if(!checkContainsTarget(target)) { - KLALBRemoteLine line= new KLALBRemoteLine(target); + } + } catch (SocketException e) { + if (!checkContainsTarget(target)) { + KLALBRemoteLine line = new KLALBRemoteLine(target); addRemoteLine(line); added.add(line); - } - //throw e; } - - return added; - }finally { - lineslock.writeLock().unlock(); - } + // throw e; + } + + return added; + } finally { + lineslock.writeLock().unlock(); + } } + public List removeRemoteLines(MultipurposeSocketAddress mpsa) { - Listrmved=new ArrayList<>(); - for (Iterator iterator = lines.iterator(); iterator.hasNext();) { - KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next(); - if(mpsa.equals( klalbRemoteLine.getSocketAddress())){ + List rmved = new ArrayList<>(); + for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { + IPv6NetworkLink link= iterator.next(); + if(link instanceof KLALBRemoteLine) { + KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine)link; + if (mpsa.equals(klalbRemoteLine.getSocketAddress())) { klalbRemoteLine.close(); rmved.add(klalbRemoteLine); } + } } return rmved; } + public Inet6Address getRemoteVaddrBySocketAddress(MultipurposeSocketAddress target) throws SocketTimeoutException { - KLALBRemoteLine kr=null; - for (Iterator iterator = lines.iterator(); iterator.hasNext();) { - KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next(); - if(target.equals(klalbRemoteLine.getSocketAddress())&&klalbRemoteLine.getBindAddress()==null) { - kr=klalbRemoteLine; + KLALBRemoteLine kr = null; + for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { + IPv6NetworkLink link= iterator.next(); + if(link instanceof KLALBRemoteLine) { + KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link; + if (target.equals(klalbRemoteLine.getSocketAddress()) && klalbRemoteLine.getBindAddress() == null) { + kr = klalbRemoteLine; break; } + } } - - if(kr==null) { - kr=new KLALBRemoteLine(target); - addRemoteLine(kr); - kr.waitForRemoteVaddrAvaliable(20000); - }else { + + if (kr == null) { + kr = new KLALBRemoteLine(target); + addRemoteLine(kr); + kr.waitForRemoteVaddrAvaliable(20000); + } else { kr.reconnectImmediately(); kr.waitForRemoteVaddrAvaliable(20000); } return kr.getRemoteVaddr().getAddress(); } - private boolean checkContainsTargetAndBind(MultipurposeSocketAddress target,MultipurposeSocketAddress bind) { - boolean b=false; - for (Iterator iterator = lines.iterator(); iterator.hasNext();) { - KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next(); - if(bind.equals(klalbRemoteLine.getBindAddress())&&target.equals(klalbRemoteLine.getSocketAddress())) { - b=true; + + private boolean checkContainsTargetAndBind(MultipurposeSocketAddress target, MultipurposeSocketAddress bind) { + boolean b = false; + for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { + IPv6NetworkLink link= iterator.next(); + if(link instanceof KLALBRemoteLine) { + KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link; + if (bind.equals(klalbRemoteLine.getBindAddress()) && target.equals(klalbRemoteLine.getSocketAddress())) { + b = true; break; } + } } return b; } private boolean checkContainsTarget(MultipurposeSocketAddress target) { - boolean b=false; - for (Iterator iterator = lines.iterator(); iterator.hasNext();) { - KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next(); - if(target.equals(klalbRemoteLine.getSocketAddress())) { - b=true; + boolean b = false; + for (Iterator iterator = srv6Router.getLinkTabel().iterator(); iterator.hasNext();) { + IPv6NetworkLink link= iterator.next(); + if(link instanceof KLALBRemoteLine) { + KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link; + if (target.equals(klalbRemoteLine.getSocketAddress())) { + b = true; break; } } + } return b; } - public void addRemoteLine(KLALBRemoteLine krs) { + public void addRemoteLine(KLALBRemoteLine krs) { lineslock.writeLock().lock(); try { - krs.setPacketReceiver(prc); - krs.setKlalbController(this); - krs.setLocalVaddrSupplier(()->{return getSelf();}); - krs.startIO(); - String selflineTable=generateSelfLineTable(); - if(selflineTable!=null&&!selflineTable.equals("")) - krs.sendPacket(new ADDLINESPacket(selflineTable)); - lines.add(krs); - }finally { + //krs.setPacketReceiver(prc); + krs.setKlalbController(this); + krs.setLocalVaddrSupplier(() -> { + return getSelf(); + }); + krs.startIO(); + String selflineTable = generateSelfLineTable(); + if (selflineTable != null && !selflineTable.equals("")) + krs.sendPacket(new ADDLINESPacket(selflineTable)); + srv6Router.getLinkTabel().add(krs); + } finally { lineslock.writeLock().unlock(); } } - private String generateSelfLineTable() { - StringBuilder sbd=new StringBuilder(); + StringBuilder sbd = new StringBuilder(); for (Iterator iterator = selflineTable.iterator(); iterator.hasNext();) { MultipurposeSocketAddress klalbRemoteLine = (MultipurposeSocketAddress) iterator.next(); sbd.append(klalbRemoteLine.toString()); @@ -554,348 +692,395 @@ public class KLALBController { } return sbd.toString(); } - - private class KLALBProtocolPacketConsumer implements PacketConsumer{ + + private class UDPProtocolPacketConsumer implements PacketConsumer { @Override - public void accept(IPv6Packet packx) throws IOException { - //HighPerformanceExecutor.defaultExecutor.execute(()->{ - - /*System.out.println("RCV:"+packx.getPayload().getData()); - byte[]b=new byte[packx.getPayload().getData().limit()]; - packx.getPayload().getData().get(0, b); - System.out.println(Arrays.toString(b));*/ - IPv6Payload pl=packx.getPayload(); + public boolean accept(IPv6Packet packx) throws IOException { + + IPv6Payload pl = packx.getPayload(); packx.putTimePassport("unpacked"); packx.printPassport(); - if(pl instanceof KLALBPacket) { - KLALBPacket rec=(KLALBPacket) pl; - //KLALBPacket rec=KLALBPacket.createByBuffer(packx.getPayload().getData()); - if(showpacket) - System.out.println("KLALB_RX:"+rec); - if(rec instanceof PortPacket) { - rec.setCE(packx.isCE()); - Inet6Address srcA=packx.getSourceAddress(); - PortPacket pt=(PortPacket) rec; - if(!streamPortBinder.distributePacketToConsumer( srcA,pt)) { - if(!(pt instanceof RSTPacket)) - try { - sendPacketToAddress(srcA,0, new RSTPacket(pt.getDport(), pt.getSport()),2); - } catch (IOException e) { - e.printStackTrace(); - } + if (pl instanceof UDPPacket) { + UDPPacket rec = (UDPPacket) pl; + if (showpacket) + System.out.println("UDP_RX:" + rec); + Inet6Address srcA = packx.getSourceAddress(); + PortPacket pt = (PortPacket) rec; + if(datagramPortBinder.distributePacketToConsumer(srcA, pt)) { + return true; } } + return false; + // packx.dispose(); + // }); + } + + } + + private class KLALBProtocolPacketConsumer implements PacketConsumer { + + @Override + public boolean accept(IPv6Packet packx) throws IOException { + IPv6Payload pl = packx.getPayload(); + packx.putTimePassport("unpacked"); + packx.printPassport(); + if (pl instanceof KLALBPacket) { + KLALBPacket rec = (KLALBPacket) pl; + if (showpacket) + System.out.println("KLALB_RX:" + rec); + if (rec instanceof PortPacket) { + rec.setCE(packx.isCE()); + Inet6Address srcA = packx.getSourceAddress(); + PortPacket pt = (PortPacket) rec; + if (streamPortBinder.distributePacketToConsumer(srcA, pt)) { + }else { + if (!(pt instanceof RSTPacket)) + HighPerformanceExecutor.defaultExecutor.execute(() -> { + sendPacketToAddress(srcA, 0, new RSTPacket(pt.getDstPort(), pt.getSrcPort()), 2); + }); + } + } } - //packx.dispose(); - //}); + return true; + // packx.dispose(); } - + } - private void loadSRv6ProtocolStack(Inet6AddressGroup selfx,boolean enableVirtualAdapter) { - srv6Router=new SRv6Router(selfx); - if(enableVirtualAdapter) - try { - IPv6TUNLoopbackNetworkLink tunlink=new IPv6TUNLoopbackNetworkLink(new Inet6AddressGroup( srv6Router.getLocator().getAddress(),32),SRv6Router.MTU, dnsAddresses); - tunlink.setMonitor(datatMonitor); - srv6Router.getLinkTabel().add(tunlink); - } catch (Exception e) { - e.printStackTrace(); - } + + private void loadSRv6ProtocolStack(Inet6AddressGroup selfx, boolean enableVirtualAdapter) { + srv6Router = new SRv6Router(selfx); srv6Router.runKLALBRouteProtocol(); - srv6Router.getProtocolNumberRegister().put(KLALBPacket.KLALB_PROTOCOL_NUMBER,new KLALBProtocolPacketConsumer()); + routingProtocol = srv6Router.getKlalbRouteProtol(); + routingProtocol.addReceiver((addr,packet)->{ + + + }); + System.out.println("SRv6协议栈已加载"); - } - public KLALBController() { - this(true,null); - } - public KLALBController (Inet6Address self) { - this(self,true,null); - } - public KLALBController(Inet6Address self,boolean enableVirtualAdapter,List dnsaddr) { - this.dnsAddresses=dnsaddr; - Inet6AddressGroup selfg =new Inet6AddressGroup(self, PREFIX); - loadSRv6ProtocolStack(selfg,enableVirtualAdapter); - } - public KLALBController(boolean enableVirtualAdapter,List dnsaddr) { - this.dnsAddresses=dnsaddr; - SecureRandom sc=new SecureRandom(); - byte[]v=new byte[16]; - sc.nextBytes(v); - v[0]=(byte)0x24; - v[1]=(byte) 0x86; - v[2]=0; - v[3]=1; - v[14]=0; - v[15]=1; - Inet6AddressGroup selfx=null; + + if (enableVirtualAdapter) + try { + IPv6TUNLoopbackNetworkLink tunlink = new IPv6TUNLoopbackNetworkLink( + new Inet6AddressGroup(srv6Router.getLocator().getAddress(), 32), SRv6Router.MTU, dnsAddresses); + tunlink.setMonitor(datatMonitor); + //srv6Router.getLinkTabel().add(tunlink); + srv6Router.getinLoopback().setFallbackLink(tunlink); + System.out.println("虚拟网卡已挂载"); + } catch (Exception e) { + System.err.println("挂载虚拟网卡失败,可能是无管理员权限?请尝试使用管理员权限运行软件"); + e.printStackTrace(); + } + + + srv6Router.getinLoopback(). getProtocolNumberRegister().put(UDPPacket.UDP_PROTOCOL_NUMBER, new UDPProtocolPacketConsumer()); + System.out.println("UDP协议已加载"); + srv6Router.getinLoopback().getProtocolNumberRegister().put(KLALBPacket.KLALB_PROTOCOL_NUMBER, + new KLALBProtocolPacketConsumer()); + System.out.println("KLALB协议已加载"); + String iproxyname="KLALB_"+UUID.randomUUID(); + registerToProxyTypeAs(iproxyname); + + clock = new HighAccuracyClock(); + NTPContext context = new NTPContext(clock); + context.syncToSystem(); + //System.out.println(context); try { - selfx=new Inet6AddressGroup( (Inet6Address) InetAddress.getByAddress(v),PREFIX); + NTPv4Protocol nvc = new NTPv4Protocol(context, new MultipurposeSocketAddress("{"+iproxyname+"_Datagram}0.0.0.0:123")); + srv6Router.addSRv6RouterListener(new SRv6RouterListener() { + + @Override + public void onLinkChanged(SRv6Router router, IPv6NetworkLink link) { + + List nb=router.getNeighbors(); + //System.out.println("srv6 ip"+nb); + Set sp=nvc.getPeers(); + for (Neighbor neighbor : nb) { + if(neighbor.getLocator()!=null) + sp.add(new NTPPeer(new MultipurposeSocketAddress(iproxyname+"_Datagram",neighbor.getLocator().getAddress().getHostAddress(),123), NTPv4Packet.NTP_SYMMETRIC_ACTIVE)); + + } + sp.removeIf((p)->{ + for (Neighbor neighbor : nb) { + try { + if(neighbor.getLocator()!=null) + if(neighbor.getLocator().getAddress().equals(p.getAddress().getInetAddress())) { + return false; + } + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + return true; + }); + } + }); + nvc2 = new NTPv4Protocol(context, new MultipurposeSocketAddress("{UDP}0.0.0.0:0"));// 106.55.184.199 + + System.out.println("NTP时钟同步协议已加载"); + } catch (UnknownHostException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + } catch (IOException e) { + // TODO 自动生成的 catch 块 + e.printStackTrace(); + }// 106.55.184.199 + } + + + private void loadController() { + this.apiServer=new KLALBRoutingProtocolAPIServer(routingProtocol, this); + this.apiClient=new KLALBRoutingProtocolAPIClient(routingProtocol); + twk.schedule(tsk1, 2000, 2000); + twk.schedule(tsk2, 2000, 2000); + twk.schedule(tsk3, 5000, 5000); + } + + public KLALBController() { + this(true, null); + } + + public KLALBController(Inet6Address self) { + this(self, true, null); + } + + public KLALBController(Inet6Address self, boolean enableVirtualAdapter, List dnsaddr) { + this.dnsAddresses = dnsaddr; + Inet6AddressGroup selfg = new Inet6AddressGroup(self, PREFIX); + initKLALB(enableVirtualAdapter, selfg); + } + + protected void initKLALB(boolean enableVirtualAdapter, Inet6AddressGroup selfg) { + loadSRv6ProtocolStack(selfg, enableVirtualAdapter); + loadController(); + } + + + public KLALBController(boolean enableVirtualAdapter, List dnsaddr) { + this.dnsAddresses = dnsaddr; + SecureRandom sc = new SecureRandom(); + byte[] v = new byte[16]; + sc.nextBytes(v); + v[0] = (byte) 0x24; + v[1] = (byte) 0x86; + v[2] = 0; + v[3] = 1; + v[14] = 0; + v[15] = 1; + Inet6AddressGroup selfx = null; + try { + selfx = new Inet6AddressGroup((Inet6Address) InetAddress.getByAddress(v), PREFIX); } catch (UnknownHostException e) { e.printStackTrace(); } - loadSRv6ProtocolStack(selfx,enableVirtualAdapter); + initKLALB(enableVirtualAdapter, selfx); } public KLALBController(List daddr) { - this(true,daddr); + this(true, daddr); } public KLALBController(Inet6Address self, List daddr) { - this(self,true,daddr); + this(self, true, daddr); } public KLALBController(boolean enableVirtualAdapter) { - this(enableVirtualAdapter,null); + this(enableVirtualAdapter, null); } - protected KLALBVirtualSocketImpl createVirtualImpl() { + protected KLALBVirtualSocketImpl createVirtualSocketImpl() { return new KLALBVirtualSocketImpl(this); } + + protected KLALBVirtualDatagramSocketImpl createVirtualDatagramSocketImpl() { + return new KLALBVirtualDatagramSocketImpl(this); + } private SRv6Router srv6Router; - - + public SRv6Router getIpv6Router() { return srv6Router; } -private Timer trtr=new Timer("路由表刷新计时器", true); -{ - trtr.scheduleAtFixedRate(new TimerTask() { - - @Override - public void run() { - //Map> lines2 =new ConcurrentHashMap<>(); - for (Iterator iterator = lines.iterator(); iterator.hasNext();) { - KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next(); - if(klalbRemoteLine.isClosed()) { - lineslock.writeLock().lock(); - try { - lines.remove(klalbRemoteLine); - }finally{ - lineslock.writeLock().unlock(); - } - }else { - if(klalbRemoteLine.getRemoteVaddr()!=null&&klalbRemoteLine.getMonitor().getState()==MonitorData.ONLINE) { - /* if(lines2.containsKey(klalbRemoteLine.getRemoteVaddr())) { - lines2.get(klalbRemoteLine.getRemoteVaddr()).getEntries().add(klalbRemoteLine); - }else { - ArrayListal1=new ArrayList<>(); - al1.add(klalbRemoteLine); - lines2.put(klalbRemoteLine.getRemoteVaddr().getAddress(), new DWRRLoadingBalanceAlgorithm<>(al1)); - }*/ - if(!srv6Router.getLinkTabel().contains(klalbRemoteLine)) { - srv6Router.getLinkTabel().add(klalbRemoteLine); - } - } - } - } - /*for (Iterator>> iterator = lines2.entrySet().iterator(); iterator.hasNext();) { - Entry> klalbRemoteLine = (Entry>) iterator.next(); - List lineList=klalbRemoteLine.getValue().getEntries(); - lineList.forEach((r)->{ - r.runPredict(); - }); - Collections.sort(lineList); - for (int i = 0; i < lineList.size(); i++) { - KLALBRemoteLine krl=lineList.get(i); - krl.noticeRank(i); - } - - } - KLALBController.this.lines2=lines2;*/ - if(srv6Router!=null) { - srv6Router.getLinkTabel().removeIf((v)->{ - return (v instanceof KLALBRemoteLine)&&(!v.isUp()); - }); - srv6Router.updateRouteTabel(); - } - } - }, 2, 2); - } - /*private void updateLines2(Inet6Address addr) throws SocketTimeoutException { - List l=new ArrayList(); - for (int i = 0; i < lines.size(); i++) { - KLALBRemoteLine klalbRemoteLine = lines.get(i); - if(klalbRemoteLine.isClosed()) { - lines.remove(i); - i--; - continue; - } - if(addr.equals(klalbRemoteLine.getRemoteVaddr())&&klalbRemoteLine.getMonitor().getState()==MonitorData.ONLINE) { - l.add(klalbRemoteLine); - } - } - - if(l.isEmpty()) { - lines2.remove(addr); - }else { - l.forEach((r)->{ - r.runPredict(); + private Timer trtr = new Timer("路由表刷新计时器", true); + { + trtr.scheduleAtFixedRate(new TimerTask() { + + @Override + public void run() { + if (srv6Router != null) { + srv6Router.getLinkTabel().removeIf((v) -> { + return (v instanceof KLALBRemoteLine) && ((KLALBRemoteLine) v).isClosed(); }); - Collections.sort(l); - lines2.put(addr, l); + srv6Router.updateRouteTabel(); } - }*/ - //private Map> lines2 = new ConcurrentHashMap<>(); + } + }, 100, 100); + } - - protected void sendPacketToAddress(Inet6Address addr,int flowlabel, KLALBPacket packet) - throws IOException { - sendPacketToAddress(addr,flowlabel, packet, 1); + protected void sendPacketToAddress(Inet6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet) { + sendPacketToAddress(addr, flowlabel, packet, 1); } - - protected void sendPacketToAddress(Inet6Address addr, int flowlabel,KLALBPacket packet, int count) - throws IOException { - HighPerformanceExecutor.defaultExecutor.execute(()->{ - - IPv6Packet ipv=new IPv6Packet(); - - - if(showpacket) - System.out.println("KLALB_TX:"+packet); - - ipv.setVersion(6); - ipv.setTrafficClass(0); - ipv.setFlowLabel(flowlabel); - ipv.setHopLimit(255); - ipv.setSourceAddress(getSelf().getAddress()); - ipv.setDestinationAddress(addr); - ipv.setPriority(packet.getPriority()); - if(packet instanceof DATATPacket) { + + protected void sendPacketToAddress(Inet6Address addr, int flowlabel, IPv6Packet.IPv6Payload packet, int count) + { + //HighPerformanceExecutor.defaultExecutor.execute(() -> { + + IPv6Packet ipv = new IPv6Packet(); + + if (showpacket) + System.out.println("KLALB_TX:" + packet); + + ipv.setVersion(6); + ipv.setTrafficClass(0); + ipv.setFlowLabel(flowlabel); + ipv.setHopLimit(255); + ipv.setSourceAddress(getSelf().getAddress()); + ipv.setDestinationAddress(addr); + ipv.setPriority(packet.getPriority()); + // if(packet instanceof DATATPacket) { ipv.setPromise(true); - } - ipv.enableECN(); - /* if(b) - ipv.markCE();*/ - ipv.setPayload(packet); - //System.out.println(ipv.getPayload().getProtocolNumber()); - /*System.out.println("SND:"+ipv.getPayload().getData()); - byte[]b=new byte[ipv.getPayload().getData().limit()]; - ipv.getPayload().getData().get(0, b); - System.out.println(Arrays.toString(b));*/ - //packet.getSendRecord().add(null); - packet.incSendCounter(); - - packet.putTimePassport("packedInIPv6"); - packet.printPassport(); - ipv.putTimePassport("packed"); - srv6Router.insertSRHandRoutePacket(ipv); - //srv6Router.putProtocolNumberPacketAndInsertSRHAsync(ipv); - }); + // } + ipv.enableECN(); + /* + * if(b) ipv.markCE(); + */ + ipv.setPayload(packet); + packet.setParent(ipv); + // System.out.println(ipv.getPayload().getProtocolNumber()); + /* + * System.out.println("SND:"+ipv.getPayload().getData()); byte[]b=new + * byte[ipv.getPayload().getData().limit()]; ipv.getPayload().getData().get(0, + * b); System.out.println(Arrays.toString(b)); + */ + // packet.getSendRecord().add(null); + if(packet instanceof KLALBPacket) + ((KLALBPacket) packet).incSendCounter(); + + packet.putTimePassport("packedInIPv6"); + packet.printPassport(); + ipv.putTimePassport("packed"); + srv6Router.insertSRHandRoutePacket(ipv); + // srv6Router.putProtocolNumberPacketAndInsertSRHAsync(ipv); + //}); } - - - private Map> bandwidthDistrmap=new ConcurrentHashMap<>(); - - private Lock bdmLock=new ReentrantLock(); - + + private Map> bandwidthDistrmap = new ConcurrentHashMap<>(); + + private Lock bdmLock = new ReentrantLock(); + protected Map> getBandwidthDistrmap() { return bandwidthDistrmap; } - - protected void registerDistUpdateConsumer(Inet6Address targetaAddress,PortPair portp, Consumer updateConsumer) { - if(updateConsumer==null) { - System.out.println("连接"+targetaAddress.getHostAddress()+" "+portp+" 释放带宽!"); - bdmLock.lock(); - try { - BandwidthDistributer bdr= bandwidthDistrmap.get(targetaAddress); - if(bdr!=null) { - bdr.setDistrUpdateConsumer(portp, updateConsumer); - bdr.setBandwidthRequest(portp, 0L); - if(bdr.getDistrUpdateConsumerMap().isEmpty()) { - bandwidthDistrmap.remove(targetaAddress); - } - } - }finally { - bdmLock.unlock(); - } - }else { - System.out.println("连接"+targetaAddress.getHostAddress()+" "+portp+" 申请带宽!"); - bdmLock.lock(); - try { - BandwidthDistributer bdr= bandwidthDistrmap.get(targetaAddress); - if(bdr==null) { - bdr=new BandwidthDistributer<>(1024*20000L*1024); - bdr.setTotalRequestUpdateConsumer((treq)->{ - KLALBRoutingProtocol krp= srv6Router.getKlalbRouteProtol(); - krp.updateTotalRequestBandwidth(targetaAddress,treq);}); - bandwidthDistrmap.put(targetaAddress, bdr); - } - - bdr.setDistrUpdateConsumer(portp, updateConsumer); - }finally { - bdmLock.unlock(); - } - } - } - - protected void updateBandwidthRequest(Inet6Address targetaAddress,PortPair portp,long bandwidth) { - if(bandwidth<0) { - throw new IllegalArgumentException(bandwidth+"<0"); - } - //System.out.println("连接"+targetaAddress.getHostAddress()+" "+portp+" 调整带宽到"+bandwidth/1024 +"KB/s!"); - BandwidthDistributer bdr= bandwidthDistrmap.get(targetaAddress); - - if(bdr!=null) { - bdr.setBandwidthRequest(portp, bandwidth); - }else { - throw new NullPointerException("连接"+targetaAddress.getHostAddress()+" "+portp+" 未申请带宽!"); - } - - } - -private Timer t=new Timer("数据包重传计时器", true); + protected void registerDistUpdateConsumer(Inet6Address targetaAddress, PortPair portp, + Consumer updateConsumer) { + if (updateConsumer == null) { + System.out.println("连接" + targetaAddress.getHostAddress() + " " + portp + " 释放带宽!"); + bdmLock.lock(); + try { + BandwidthDistributer bdr = bandwidthDistrmap.get(targetaAddress); + if (bdr != null) { + bdr.setDistrUpdateConsumer(portp, updateConsumer); + bdr.setBandwidthRequest(portp, 0L); + if (bdr.getDistrUpdateConsumerMap().isEmpty()) { + bandwidthDistrmap.remove(targetaAddress); + } + } + } finally { + bdmLock.unlock(); + } + } else { + System.out.println("连接" + targetaAddress.getHostAddress() + " " + portp + " 申请带宽!"); + bdmLock.lock(); + try { + BandwidthDistributer bdr = bandwidthDistrmap.get(targetaAddress); + if (bdr == null) { + bdr = new BandwidthDistributer<>(1024 * 20000L * 1024); + bdr.setTotalRequestUpdateConsumer((treq) -> { + KLALBRoutingProtocol krp = srv6Router.getKlalbRouteProtol(); + krp.updateTotalRequestBandwidth(targetaAddress, treq); + }); + bandwidthDistrmap.put(targetaAddress, bdr); + } + + bdr.setDistrUpdateConsumer(portp, updateConsumer); + } finally { + bdmLock.unlock(); + } + } + } + + protected void updateBandwidthRequest(Inet6Address targetaAddress, PortPair portp, long bandwidth) { + if (bandwidth < 0) { + throw new IllegalArgumentException(bandwidth + "<0"); + } + // System.out.println("连接"+targetaAddress.getHostAddress()+" "+portp+" + // 调整带宽到"+bandwidth/1024 +"KB/s!"); + BandwidthDistributer bdr = bandwidthDistrmap.get(targetaAddress); + + if (bdr != null) { + bdr.setBandwidthRequest(portp, bandwidth); + } else { + throw new NullPointerException("连接" + targetaAddress.getHostAddress() + " " + portp + " 未申请带宽!"); + } + + } + + private Timer t = new Timer("数据包重传计时器", true); + protected Timer getResendTimer() { return t; } -private Timer t2=new Timer("数据包粘包计时器", true); -private List listens=new CopyOnWriteArrayList<>(); + private Timer t2 = new Timer("数据包粘包计时器", true); + + private List listens = new CopyOnWriteArrayList<>(); public Timer getNagleTimer() { return t2; } - - - + public void registerToProxyTypeAs(String proxyname) { - MultipurposeSocketAddress.getSocketTypeRegister().put(proxyname+"_Stream",socketType); - //ProxyProfileEntry.getRegister().put(proxyname, this); + MultipurposeSocketAddress.getSocketTypeRegister().put(proxyname + "_Stream", streamSocketType); + MultipurposeSocketAddress.getSocketTypeRegister().put(proxyname + "_Datagram", datagramSocketType); + // ProxyProfileEntry.getRegister().put(proxyname, this); } - public List getListenSocketAddress() { return listens; } + private Listntptable=new CopyOnWriteArrayList(); - /*@Override - public void listen(MultipurposeSocketAddress msa) { - // TODO 自动生成的方法存根 - + private KLALBRoutingProtocol routingProtocol; + public List getNTPTable() { + return ntptable;//nvc2.getPeers().add(new NTPPeer("{UDP}106.55.184.199:123", NTPv4Packet.NTP_CLIENT)); } - @Override - public void unlisten(MultipurposeSocketAddress msc) { - // TODO 自动生成的方法存根 - - } - - @Override - public void connect(MultipurposeSocketAddress msa) { - // TODO 自动生成的方法存根 - - } - - @Override - public void unconnect(MultipurposeSocketAddress msc) { - // TODO 自动生成的方法存根 - - }*/ - + + /* + * @Override public void listen(MultipurposeSocketAddress msa) { // TODO + * 自动生成的方法存根 + * + * } + * + * @Override public void unlisten(MultipurposeSocketAddress msc) { // TODO + * 自动生成的方法存根 + * + * } + * + * @Override public void connect(MultipurposeSocketAddress msa) { // TODO + * 自动生成的方法存根 + * + * } + * + * @Override public void unconnect(MultipurposeSocketAddress msc) { // TODO + * 自动生成的方法存根 + * + * } + */ + } diff --git a/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java index eb1199b..3d3c9c3 100644 --- a/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java +++ b/src/org/kne/cloud/network/klalb/KLALBControllerConfigItem.java @@ -22,9 +22,17 @@ public class KLALBControllerConfigItem extends KLALBConfigItem { private String VirtualSocketName; private ListLineTable=new ArrayList<>(); private ListConnectLineTable=new ArrayList<>(); + private ListntpServerTable=new ArrayList<>(); + public void setNetworkInterfaceExcepts(List networkInterfaceExcepts) { + NetworkInterfaceExcepts = networkInterfaceExcepts; + } + + + + private ListNetworkInterfaceExcepts=new ArrayList<>(); - + public KLALBControllerConfigItem(String type, boolean nogui, String virtualAddress, Long virtualASN, List dNS, MultipurposeSocketAddress tCPListen, MultipurposeSocketAddress uDPListen, @@ -43,6 +51,12 @@ public class KLALBControllerConfigItem extends KLALBConfigItem { } + + + public List getNetworkInterfaceExcepts() { + return NetworkInterfaceExcepts; + } + public void setLanguage(String language) { this.language = language; @@ -170,12 +184,27 @@ public class KLALBControllerConfigItem extends KLALBConfigItem { + public List getNtpServerTable() { + return ntpServerTable; + } + + + + + public void setNtpServerTable(List ntpServerTable) { + this.ntpServerTable = ntpServerTable; + } + + + + @Override public String toString() { return "KLALBControllerConfigItem [language=" + language + ", nogui=" + nogui + ", VirtualAddress=" + VirtualAddress + ", VirtualASN=" + VirtualASN + ", DNS=" + DNS + ", TCPListen=" + TCPListen + ", UDPListen=" + UDPListen + ", VirtualSocketName=" + VirtualSocketName + ", LineTable=" + LineTable - + ", ConnectLineTable=" + ConnectLineTable + "]"; + + ", ConnectLineTable=" + ConnectLineTable + ", ntpServerTable=" + ntpServerTable + + ", NetworkInterfaceExcepts=" + NetworkInterfaceExcepts + "]"; } @@ -184,8 +213,18 @@ public class KLALBControllerConfigItem extends KLALBConfigItem { public int hashCode() { final int prime = 31; int result = super.hashCode(); - result = prime * result + Objects.hash(ConnectLineTable, DNS, LineTable, TCPListen, UDPListen, VirtualASN, - VirtualAddress, VirtualSocketName, language, nogui); + result = prime * result + ((ConnectLineTable == null) ? 0 : ConnectLineTable.hashCode()); + result = prime * result + ((DNS == null) ? 0 : DNS.hashCode()); + result = prime * result + ((LineTable == null) ? 0 : LineTable.hashCode()); + result = prime * result + ((NetworkInterfaceExcepts == null) ? 0 : NetworkInterfaceExcepts.hashCode()); + result = prime * result + ((TCPListen == null) ? 0 : TCPListen.hashCode()); + result = prime * result + ((UDPListen == null) ? 0 : UDPListen.hashCode()); + result = prime * result + ((VirtualASN == null) ? 0 : VirtualASN.hashCode()); + result = prime * result + ((VirtualAddress == null) ? 0 : VirtualAddress.hashCode()); + result = prime * result + ((VirtualSocketName == null) ? 0 : VirtualSocketName.hashCode()); + result = prime * result + ((language == null) ? 0 : language.hashCode()); + result = prime * result + (nogui ? 1231 : 1237); + result = prime * result + ((ntpServerTable == null) ? 0 : ntpServerTable.hashCode()); return result; } @@ -200,12 +239,64 @@ public class KLALBControllerConfigItem extends KLALBConfigItem { if (getClass() != obj.getClass()) return false; KLALBControllerConfigItem other = (KLALBControllerConfigItem) obj; - return Objects.equals(ConnectLineTable, other.ConnectLineTable) && Objects.equals(DNS, other.DNS) - && Objects.equals(LineTable, other.LineTable) && Objects.equals(TCPListen, other.TCPListen) - && Objects.equals(UDPListen, other.UDPListen) && Objects.equals(VirtualASN, other.VirtualASN) - && Objects.equals(VirtualAddress, other.VirtualAddress) - && Objects.equals(VirtualSocketName, other.VirtualSocketName) - && Objects.equals(language, other.language) && nogui == other.nogui; + if (ConnectLineTable == null) { + if (other.ConnectLineTable != null) + return false; + } else if (!ConnectLineTable.equals(other.ConnectLineTable)) + return false; + if (DNS == null) { + if (other.DNS != null) + return false; + } else if (!DNS.equals(other.DNS)) + return false; + if (LineTable == null) { + if (other.LineTable != null) + return false; + } else if (!LineTable.equals(other.LineTable)) + return false; + if (NetworkInterfaceExcepts == null) { + if (other.NetworkInterfaceExcepts != null) + return false; + } else if (!NetworkInterfaceExcepts.equals(other.NetworkInterfaceExcepts)) + return false; + if (TCPListen == null) { + if (other.TCPListen != null) + return false; + } else if (!TCPListen.equals(other.TCPListen)) + return false; + if (UDPListen == null) { + if (other.UDPListen != null) + return false; + } else if (!UDPListen.equals(other.UDPListen)) + return false; + if (VirtualASN == null) { + if (other.VirtualASN != null) + return false; + } else if (!VirtualASN.equals(other.VirtualASN)) + return false; + if (VirtualAddress == null) { + if (other.VirtualAddress != null) + return false; + } else if (!VirtualAddress.equals(other.VirtualAddress)) + return false; + if (VirtualSocketName == null) { + if (other.VirtualSocketName != null) + return false; + } else if (!VirtualSocketName.equals(other.VirtualSocketName)) + return false; + if (language == null) { + if (other.language != null) + return false; + } else if (!language.equals(other.language)) + return false; + if (nogui != other.nogui) + return false; + if (ntpServerTable == null) { + if (other.ntpServerTable != null) + return false; + } else if (!ntpServerTable.equals(other.ntpServerTable)) + return false; + return true; } diff --git a/src/org/kne/cloud/network/klalb/KLALBMain.java b/src/org/kne/cloud/network/klalb/KLALBMain.java index d2f5d49..8cc409c 100644 --- a/src/org/kne/cloud/network/klalb/KLALBMain.java +++ b/src/org/kne/cloud/network/klalb/KLALBMain.java @@ -17,6 +17,7 @@ import javax.swing.JFrame; import org.kne.cloud.network.MultipurposeSocketAddress; import org.kne.cloud.network.SocketChannelListener; import org.kne.cloud.network.SocketListener; +import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.ipv6.RouteItem; import org.kne.cloud.network.klalb.ui.KLALBStateGUI2; import org.kne.cloud.network.klalb.ui.KLALBStateGUI3; @@ -25,6 +26,7 @@ import org.kne.cloud.network.perf.Kperf; import org.kne.cloud.network.perf.MemcpyBenchmark; import org.kne.cloud.network.perf.NodeBenchmark; import org.kne.debug.Debuger; +import org.kne.debug.TimeDebugger; public class KLALBMain { public static KLALBStateGUI3 ksg; @@ -36,18 +38,23 @@ public class KLALBMain { } System.out.println(CONST.klalb+" V"+CONST.klalbver); Scanner scn=new Scanner(System.in); - + TimeDebugger dtb=new TimeDebugger(); + dtb.putTime("Start"); File configJson=new File("klalb-config.json"); KLALBProxySystem kpcje=new KLALBProxySystem(); + dtb.putTime("Create"); kpcje.loadConfigJson(configJson); + dtb.putTime("Load"); System.out.println("SRv6地址:"+kpcje.getKlalbController().getSelf().getAddress().getHostAddress()); try { if(!kpcje.getControllerConfig().isNogui()) - openGUI(kpcje); + openGUI(kpcje); }catch(Throwable e) { e.printStackTrace(); } + dtb.putTime("UI"); + //dtb.print(); /*MultipurposeSocketAddress mpa=new MultipurposeSocketAddress("127.9.9.9", 49573); kpcje.enableRemoteManagement(mpa); System.out.println("远程管理端口已在"+mpa+"端口上开启");*/ @@ -58,7 +65,7 @@ public class KLALBMain { SocketChannelListener stlr=new SocketChannelListener(kpsvr); stlr.setCon((scl)->{ try { - new Kperf(new StreamChannelKLALBPacketLink(scl)).startPerfing(); + new Kperf(new StreamChannelKLALBPacketLink(scl,false)).startPerfing(); } catch (IOException e) { e.printStackTrace(); } @@ -92,10 +99,12 @@ public class KLALBMain { System.out.println("线路状态:"); System.out.println("状态\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动"); synchronized (kpcje.getKlalbController().getLines()) { - for (Iterator iterator = kpcje.getKlalbController().getLines().iterator(); iterator.hasNext();) { - KLALBRemoteLine hostPort = iterator.next(); + for (Iterator iterator = kpcje.getKlalbController().getLines().iterator(); iterator.hasNext();) { + IPv6NetworkLink link=iterator.next(); + if(link instanceof KLALBRemoteLine) { + KLALBRemoteLine hostPort = (KLALBRemoteLine) link; System.out.println(hostPort .toString()); - //System.out.println(); + } } } break; @@ -209,13 +218,13 @@ public class KLALBMain { } private static void openGUI(KLALBProxySystem kpcje) throws RuntimeException{ - /*JFrame jf=new JFrame(); - jf.setSize(200, 200); - jf.setVisible(true);*/ - if(ksg==null) + Thread t=new Thread(()->{ + if(ksg==null) { ksg=kpcje.getKLALBGUI(); + } ksg.setVisible(true); - //System.out.println("UI loaded"); + }); + t.start(); } } diff --git a/src/org/kne/cloud/network/klalb/KLALBOutputStream.java b/src/org/kne/cloud/network/klalb/KLALBOutputStream.java index 99abf2f..db79802 100644 --- a/src/org/kne/cloud/network/klalb/KLALBOutputStream.java +++ b/src/org/kne/cloud/network/klalb/KLALBOutputStream.java @@ -21,7 +21,7 @@ public class KLALBOutputStream extends DataOutputStream { flush(); } public void writeKLALBPacket(KLALBPacket klb) throws IOException { - writeInt((int) klb.getLength()); + writeInt((int) klb.getTotalLength()); KLALBPacket.writeKLALBPacketToStream(this, klb); } public void writePacket(ByteBuffer kp) throws IOException { diff --git a/src/org/kne/cloud/network/klalb/KLALBPacket.java b/src/org/kne/cloud/network/klalb/KLALBPacket.java index 0652e29..d1cce98 100644 --- a/src/org/kne/cloud/network/klalb/KLALBPacket.java +++ b/src/org/kne/cloud/network/klalb/KLALBPacket.java @@ -113,7 +113,7 @@ public abstract class KLALBPacket extends IPv6Packet.IPv6Payload { public long getRcvtime() { return rcvtime; } - public long getLength() {//缓冲区limit,实际长度 + public long getTotalLength() {//缓冲区limit,实际长度 return headerLength; } @@ -147,6 +147,7 @@ public abstract class KLALBPacket extends IPv6Packet.IPv6Payload { public static KLALBPacket readKLALBPacketFromChannel(ReadableByteChannel in) throws IOException { while(true) { ByteBuffer bb=NetworkPacket.bufferAllocator.allocate(40); + bb.position(0); bb.limit(1); while(bb.hasRemaining()){ if(in.read(bb)==-1) { diff --git a/src/org/kne/cloud/network/klalb/KLALBPacketLink.java b/src/org/kne/cloud/network/klalb/KLALBPacketLink.java index a069db6..bac1859 100644 --- a/src/org/kne/cloud/network/klalb/KLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/KLALBPacketLink.java @@ -3,15 +3,17 @@ package org.kne.cloud.network.klalb; import java.io.IOException; import java.net.SocketException; import java.nio.ByteBuffer; +import java.util.List; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; import org.kne.cloud.network.MultipurposeSocketAddress; public interface KLALBPacketLink { - public void setOutputTrafficCounters(AtomicLong[] al); - public void setOutputPacketsCounters(AtomicLong[] al); - public void setInputTrafficCounters(AtomicLong[] al); - public void setInputPacketsCounters(AtomicLong[] al); + public void setOutputTrafficCounters(LongAdder[] al); + public void setOutputPacketsCounters(LongAdder[] longAdders); + public void setInputTrafficCounters(LongAdder[] longAdders); + public void setInputPacketsCounters(LongAdder[] al); public void writePacket(ByteBuffer kp) throws IOException; public default void writePackets(ByteBuffer[] kpp,int off,int len) throws IOException { for (int i = 0; i < len; i++) { @@ -29,5 +31,6 @@ public interface KLALBPacketLink { @Override public String toString(); public boolean isStream(); + public void writeKLALBPackets(List kp) throws IOException; } diff --git a/src/org/kne/cloud/network/klalb/KLALBProxySystem.java b/src/org/kne/cloud/network/klalb/KLALBProxySystem.java index c55d0b6..cc26039 100644 --- a/src/org/kne/cloud/network/klalb/KLALBProxySystem.java +++ b/src/org/kne/cloud/network/klalb/KLALBProxySystem.java @@ -8,6 +8,7 @@ import java.io.Reader; import java.net.Inet6Address; import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.NetworkInterface; import java.net.Socket; import java.net.SocketException; import java.net.SocketTimeoutException; @@ -47,7 +48,7 @@ public class KLALBProxySystem { private Gson gson; private File jsonFile; { - GsonBuilder gb=new GsonBuilder(); + GsonBuilder gb=new GsonBuilder().setPrettyPrinting(); MultipurposeSocketAddress.registerToGsonBuilder(gb); KLALBConfigItem.registerToGsonBuilder(gb); gson=gb.create(); @@ -169,7 +170,7 @@ public class KLALBProxySystem { String vsne=kcci.getVirtualSocketName(); //if(vsne!=null) { - MultipurposeSocketAddress.getSocketTypeRegister().put(vsne, klalbController.getSocketType()); + MultipurposeSocketAddress.getSocketTypeRegister().put(vsne, klalbController.getStreamSocketType()); //} MultipurposeSocketAddress tcple=kcci.getTCPListen(); if(tcple!=null) { @@ -180,7 +181,7 @@ public class KLALBProxySystem { tcpl.setCon((soc)->{ - KLALBRemoteLine krs=null; + KLALBRemoteLine krs=null; try { krs = new KLALBRemoteLine(new StreamChannelKLALBPacketLink(soc)); klalbController.addRemoteLine(krs); @@ -220,10 +221,7 @@ public class KLALBProxySystem { } List linele=kcci.getLineTable(); if(linele!=null) { - linele.forEach((aline)->{ - klalbController.getSelflineTable().add(aline); - }); - + klalbController.getSelflineTable().addAll(linele); } List linetoc=kcci.getConnectLineTable(); if(linetoc!=null) { @@ -231,6 +229,24 @@ public class KLALBProxySystem { klalbController.addRemoteLines(aline); }); } + + List ntps=kcci.getNtpServerTable(); + if(ntps!=null) { + klalbController.getNTPTable().addAll(ntps); + } + + List strexc=kcci.getNetworkInterfaceExcepts(); + klalbController.getNetworkInterfaceExcept().clear(); + if(strexc!=null) { + for(String strexci:strexc) { + try { + klalbController.getNetworkInterfaceExcept().add(NetworkInterface.getByName(strexci)); + } catch (SocketException e) { + e.printStackTrace(); + } + } + } + }else if(item instanceof SocketBridgeConfigItem) { SocketBridgeConfigItem scci=(SocketBridgeConfigItem) item; try { diff --git a/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java b/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java index 5bf9f1a..8e970eb 100644 --- a/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java +++ b/src/org/kne/cloud/network/klalb/KLALBRemoteLine.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.io.PrintStream; import java.io.StreamCorruptedException; import java.lang.foreign.MemorySegment; +import java.math.BigInteger; import java.net.Inet6Address; import java.net.InetAddress; import java.net.SocketTimeoutException; @@ -27,21 +28,35 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.LockSupport; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; import java.util.function.Supplier; import org.kne.cloud.clock.AdjustedNanoClock; +import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.cloud.clock.NTPTimestamps; import org.kne.cloud.clock.ReliabilityBackoffTimeClock; import org.kne.cloud.network.ByteBufferAllocator; import org.kne.cloud.network.MultipurposeSocketAddress; import org.kne.cloud.network.NetworkPacket; import org.kne.cloud.network.SpeedLimiter; import org.kne.cloud.network.ThreadTool; +import org.kne.cloud.network.congress.BBRCongressAlgorithm; +import org.kne.cloud.network.congress.BBRVegasCongressAlgorithm; +import org.kne.cloud.network.congress.CongressAlgorithm; +import org.kne.cloud.network.congress.LARCCongressAlgorithm; +import org.kne.cloud.network.congress.SendPacketSlidingWindow; +import org.kne.cloud.network.congress.VegasCongressAlgorithm; +import org.kne.cloud.network.ipv6.AbstractIPv6NetworkLink; +import org.kne.cloud.network.ipv6.IPv6LinkStateListener; import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.ipv6.IPv6Packet; import org.kne.cloud.network.ipv6.IPv6Packet.IPv6EmptyPayload; @@ -50,7 +65,6 @@ import org.kne.cloud.network.ipv6.Inet6AddressGroup; import org.kne.cloud.network.ipv6.Neighbor; import org.kne.cloud.network.ipv6.RouteItem; import org.kne.cloud.network.monitor.MonitorData; -import org.kne.cloud.network.monitor.NanoTimeSeries; import org.kne.cloud.network.monitor.QueueingMonitorDataImpl; import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl; import org.kne.cloud.network.perf.TESTNPacket; @@ -61,13 +75,14 @@ import org.kne.cloud.network.te.BandwidthDistributer; import org.kne.cloud.network.te.LoadingBalanceEntry; import org.kne.concurrent.DisruptorExecutor; import org.kne.concurrent.HighPerformanceExecutor; +import org.kne.concurrent.ThreadParker; import org.kne.io.KNEChannels; +import org.kne.math.Long128; - -public class KLALBRemoteLine implements IPv6NetworkLink,Comparable { +public class KLALBRemoteLine extends AbstractIPv6NetworkLink implements IPv6NetworkLink { private static final int HEADER_CALIBRATE = 40; - + private static final boolean debug = false; private static final boolean showpacket = false; @@ -85,9 +100,7 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable getLocalVaddrSupplier() { @@ -104,8 +117,8 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable getAddressGroups() { + List list = new ArrayList<>(); + list.add(addressGroup); + return list; } - + public Inet6AddressGroup getPeerAddress() { return peerAddress; } - - public KLALBRemoteLine(MultipurposeSocketAddress mpa, Inet6AddressGroup address) { - this(mpa,address, new QueueingMonitorDataImpl()); + this(mpa, address, new QueueingMonitorDataImpl()); } public KLALBRemoteLine(MultipurposeSocketAddress mpa, Inet6AddressGroup address, QueueingMonitorDataImpl monitor) { - this(mpa, null,address, monitor); + this(mpa, null, address, monitor); } public KLALBRemoteLine(KLALBPacketLink kpl, Inet6AddressGroup address) { - this(kpl,address, new QueueingMonitorDataImpl()); + this(kpl, address, new QueueingMonitorDataImpl()); } - public KLALBRemoteLine(KLALBPacketLink kpl, Inet6AddressGroup address,QueueingMonitorDataImpl monitor) { + public KLALBRemoteLine(KLALBPacketLink kpl, Inet6AddressGroup address, QueueingMonitorDataImpl monitor) { this.kplink = kpl; - this.addressGroup=address; + this.addressGroup = address; this.monitor = monitor; monitor.setName(kpl.toString()); } - public KLALBRemoteLine(MultipurposeSocketAddress mpa, MultipurposeSocketAddress bindaddr,Inet6AddressGroup address, + public KLALBRemoteLine(MultipurposeSocketAddress mpa, MultipurposeSocketAddress bindaddr, Inet6AddressGroup address, QueueingMonitorDataImpl monitor) { this.socketAddress = mpa; this.bindAddress = bindaddr; - this.addressGroup=address; + this.addressGroup = address; this.monitor = monitor; if (bindaddr == null) { monitor.setName("→" + mpa.toString()); @@ -196,8 +210,9 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable { - //Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1); - while (true) { + private SpeedLimiter speedLimit = new SpeedLimiter(256 * 1024L, 10 * 1000000L);// 50*1000000L + + private volatile CongressAlgorithm algorithm; + + private volatile SendPacketSlidingWindow sendWindow; + + private class RerouteChecker implements Runnable { + @Override + public void run() { + while ((!kplink.isClosed()) && (!closed)) { + + if (checkACKTime()) { + sendALLIPv6ACK(); + } + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + + private class RemoteSender implements Runnable { + + @Override + public void run() { + try { + writeKLALBPacketToKPL(new ADDRREQPacket()); + writeKLALBPacketToKPL(new ADDRREQPacket()); + if (addressGroup != null) { + writeKLALBPacketToKPL(new ADDRPacket(addressGroup)); + writeKLALBPacketToKPL(new ADDRPacket(addressGroup)); + } + writeKLALBPacketToKPL(new VADDRREQPacket()); + writeKLALBPacketToKPL(new VADDRREQPacket()); + writeKLALBPacketToKPL(new VADDRPacket(localVaddrSupplier.get())); + writeKLALBPacketToKPL(new VADDRPacket(localVaddrSupplier.get())); + flushKPL(); + Listpacks=new ArrayList<>(); + while ((!kplink.isClosed()) && (!closed)) { + if (checkBandwidthReportTime()) { + sendIPacket(new BWINFPacket(monitor.getOutSpeedAvg(), monitor.getInSpeedAvg())); + } + if (checkPingTimeSleep()) { + ping(); + if (remoteVaddr == null) + writeKLALBPacketToKPL(new VADDRREQPacket()); + if (peerAddress == null) + writeKLALBPacketToKPL(new ADDRREQPacket()); - monitor.setState(MonitorData.CONNECTING); - if (socketAddress == null) { - if (kplink.isClosed()) { - close(); - break; - } - if(addressGroup==null) { - byte[]addr=new byte[16]; - SecureRandom scr=new SecureRandom(); - scr.nextBytes(addr); - addr[0]=(byte)0x24; - addr[1]=(byte) 0x86; - addr[2]=0; - addr[3]=2; - addr[14]=0; - addr[15]=1; - Inet6Address i6a=(Inet6Address) Inet6Address.getByAddress(addr); - addressGroup=new Inet6AddressGroup(i6a, 112); - } } else { - kplink = KLALBUtils. createKLALBPacketLink(bindAddress, socketAddress,false); - } - //startRecord(); + KLALBPacket kpip = IsendDequeList.poll(); + if (kpip != null) { + writeKLALBPacketToKPL(kpip); - if (klalbController != null) { + } else { - kplink.setInputTrafficCounters(new AtomicLong[] {monitor.getInTrafficAL(),klalbController.getLinkMonitor().getInTrafficAL()}); - kplink.setOutputTrafficCounters(new AtomicLong[] {monitor.getOutTrafficAL(),klalbController.getLinkMonitor().getOutTrafficAL()}); - kplink.setInputPacketsCounters(new AtomicLong[] {monitor.getInPacketCounterAL(),klalbController.getLinkMonitor().getInPacketCounterAL()}); - kplink.setOutputPacketsCounters(new AtomicLong[] {monitor.getOutPacketCounterAL(),klalbController.getLinkMonitor().getOutPacketCounterAL()}); - } else { - kplink.setInputTrafficCounters(new AtomicLong[] {monitor.getInTrafficAL()}); - kplink.setOutputTrafficCounters(new AtomicLong[] {monitor.getOutTrafficAL()}); - kplink.setInputPacketsCounters(new AtomicLong[] {monitor.getInPacketCounterAL()}); - kplink.setOutputPacketsCounters(new AtomicLong[] {monitor.getOutPacketCounterAL()}); - } - kplink.setSoTimeout(20000); - if(kplink.isStream()) { - windowPercent=1.4; - MIN_RTTVAR=50000000; - burstPercent=2.0;//1.5 - //ackInterval=10000000L; - }else { - windowPercent=1.2; - MIN_RTTVAR=20000000; - burstPercent=2.0; - //ackInterval=1000000L; - } - Thread timer = ThreadTool.makeVDaemonThread("重路由计时器线程", () -> { - Thread.currentThread().setPriority(Thread.NORM_PRIORITY+1); - while((!kplink.isClosed()) && (!closed)) { + KLALBPacket tkpp = sendDequeList.poll(); - Collectionvals= sendMap.values(); - for (Iterator iterator = vals.iterator(); iterator.hasNext();) { - SendItem sitm = (SendItem) iterator.next(); - if(System.nanoTime() -sitm.getSendtime()>RTO) { - iterator.remove(); - sendmapWindowUsed.addAndGet((int) -(sitm.getPacket().getPayload().getLength()+HEADER_CALIBRATE)); - //if(!kplink.isStream()) - if(sitm.getPacket().isPromise()) { - IPv6Packet pktr=sitm.getPacket(); - pktr.setPriority(pktr.getPriority()-1); - rerouteConsumer.accept(pktr); - } - //System.out.println("reroute"); + if (tkpp != null) { + packs.add(tkpp); + while((tkpp=sendDequeList.poll())!=null) { + packs.add(tkpp); } - } - for (Iterator> iterator = recvedUIDMap.entrySet().iterator(); iterator.hasNext();) { - Entry sendItem = (Entry) iterator.next(); - if(System.nanoTime()-sendItem.getValue()>10000000000L) { - iterator.remove(); + kplink.writeKLALBPackets(packs); + packs.clear(); + if (checkPingTime()) { + ping(); } - - } - if(checkACKTime()) { - sendALLIPv6ACK(); - //System.out.println("ACK发送"); - } - try { - Thread.sleep(4); - } catch (InterruptedException e) { - e.printStackTrace(); + + } else { + tlock.parkNanos(1000000L); } } - }); - timer.start(); - - Thread t = ThreadTool.makeVDaemonThreadIfSupport("远程发送线程", () -> { - tlock = Thread.currentThread(); - //tlock.setPriority(Thread.NORM_PRIORITY+1); - try { - writeKLALBPacketToKPL(new ADDRREQPacket()); - writeKLALBPacketToKPL(new ADDRREQPacket()); - if(addressGroup!=null) { - writeKLALBPacketToKPL(new ADDRPacket(addressGroup)); - writeKLALBPacketToKPL(new ADDRPacket(addressGroup)); - } - writeKLALBPacketToKPL(new VADDRREQPacket()); - writeKLALBPacketToKPL(new VADDRREQPacket()); - writeKLALBPacketToKPL(new VADDRPacket(localVaddrSupplier.get())); - writeKLALBPacketToKPL(new VADDRPacket(localVaddrSupplier.get())); - flushKPL(); - ByteBuffer[] kpp = new ByteBuffer[10]; - boolean haskpp=false; - int kppslen=0; - while ((!kplink.isClosed()) && (!closed)) { - // TimeDebugger tdb=new TimeDebugger(); - // tdb.putTime("start"); - if(checkBandwidthReportTime()) { - sendIPacket(new BWINFPacket(monitor.getOutSpeedAvg(), monitor.getInSpeedAvg())); - } - if (checkPingTimeSleep()) { - writeKLALBPacketToKPL(new PINGPacket(System.nanoTime())); - if (remoteVaddr == null) - writeKLALBPacketToKPL(new VADDRREQPacket()); - if(peerAddress==null) - writeKLALBPacketToKPL(new ADDRREQPacket()); - - }else { - KLALBPacket kpip = IsendDequeList.poll(); - if (kpip != null) { - writeKLALBPacketToKPL(kpip); - - }else { + } - // tdb.putTime("Isend"); + Thread.yield(); + } + } catch (StreamCorruptedException sce) { + sce.printStackTrace(); + } catch (IOException | UnresolvedAddressException e) { + if (debug) + e.printStackTrace(); + } finally { + try { + kplink.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } - if (haskpp == false) { - ByteBuffer tkpp = sendDequeList.poll(); - if(tkpp==null) { - monitor.setQueueingDelay(0); - }else { - haskpp=true; - kpp[0]=tkpp; - int i=1; - for(;i{ - KLALBPacket kpp=null; - try { - kpp = KLALBPacket.readKLALBPacketFromChannel(KNEChannels.newReadableChannel(kppb)); - } catch (IOException e) { - e.printStackTrace(); - } - if(kpp==null) - return; - debugShowPacket("RX",kpp); + private class RemoteReceiver implements Runnable { + AtomicBoolean fst = new AtomicBoolean(true); + ReentrantLock readLock=new ReentrantLock(); + @Override + public void run() { + try { + while ((!kplink.isClosed()) && (!closed)) { + KLALBPacket kppb=null; + readLock.lock(); + try { + kppb = kplink.readKLALBPacket(); + }finally { + readLock.unlock(); + } + if (kppb == null) { + break; + } + KLALBPacket kpp = kppb; + HighPerformanceExecutor.defaultExecutor2.execute(() -> { + debugShowPacket("RX", kpp); switch (kpp.getType()) { case KLALBPacket.PING: - sendIPacket(new PONGPacket(((PINGPacket) kpp).getTime() ,kpp.getRcvtime(), System.nanoTime())); + long pct=System.nanoTime()- kpp.getRcvtime(); + Long128 curr=sysclk.getCurrentTimeNanos(); + Long128 rcv=curr.subtract(pct); + + + BigInteger local1281= NTPTimestamps.nanosToNtp128BitTimestamp(curr); + PONGPacket pong=new PONGPacket(((PINGPacket) kpp).getTime(), NTPTimestamps.ntp128To64(NTPTimestamps.nanosToNtp128BitTimestamp(rcv)).longValue(), NTPTimestamps.ntp128To64(NTPTimestamps.nanosToNtp128BitTimestamp(curr)).longValue()); + sendIPacket( + pong); + /*long prcv1=pong.getTimepingrcv(); + System.out.println("prcv"+NTPTimestamps.nanosSince1970ToString( NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( prcv1,local1281)))); + long posnd1=pong.getTimepongsnd(); + System.out.println("posnd"+NTPTimestamps.nanosSince1970ToString( NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( posnd1,local1281))));*/ break; case KLALBPacket.PONG: PONGPacket png = (PONGPacket) kpp; - long ul = png.getRcvtime() - png.getTimepingsnd()-(png.getTimepongsnd()-png.getTimepingrcv()); - - long DsndDelayFactor0 = png.getTimepingrcv() - png.getTimepingsnd(); - long DrcvDelayFactor0 = png.getRcvtime() - png.getTimepongsnd(); - long DsndDelayFactor; - long DrcvDelayFactor; + /*long ul = png.getRcvtime() - png.getTimepingsnd() + - (png.getTimepongsnd() - png.getTimepingrcv());*/ + Long128 local=sysclk.getCurrentTimeNanos(); + BigInteger local128= NTPTimestamps.nanosToNtp128BitTimestamp(local); - AdjustedNanoClock adjc=adjnc; - adjc.getLock().lock(); - try { - adjc.calibrate(png.getTimepongsnd() + ul / 2 - png.getRcvtime(), ul / 2); - DsndDelayFactor = DsndDelayFactor0 - adjc.getDelta(); - DrcvDelayFactor = DrcvDelayFactor0 + adjc.getDelta(); - if (DsndDelayFactor < 0) { - if (DrcvDelayFactor < 0) { - - } else { - adjc.setDelta(adjc.getDelta() + DsndDelayFactor); - DsndDelayFactor = DsndDelayFactor0 - adjc.getDelta(); - DrcvDelayFactor = DrcvDelayFactor0 + adjc.getDelta(); - } - } else { - if (DrcvDelayFactor < 0) { - adjc.setDelta(adjc.getDelta() - DrcvDelayFactor); - DsndDelayFactor = DsndDelayFactor0 - adjc.getDelta(); - DrcvDelayFactor = DrcvDelayFactor0 + adjc.getDelta(); - } - } - } finally { - adjc.getLock().unlock(); - } + long psnd=png.getTimepingsnd(); + //System.out.println("psnd"+NTPTimestamps.nanosSince1970ToString( NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( psnd,local128)))); + long prcv=png.getTimepingrcv(); + //System.out.println("prcv"+NTPTimestamps.nanosSince1970ToString( NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( prcv,local128)))); + long posnd=png.getTimepongsnd(); + //System.out.println("posnd"+NTPTimestamps.nanosSince1970ToString( NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( posnd,local128)))); + + long DsndDelayFactor =NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( prcv,local128)) .subtract( NTPTimestamps.ntp128BitToNanosTimestamp(NTPTimestamps.inferNtp64To128( psnd,local128))).longValue(); + long DrcvDelayFactor = local .subtract( NTPTimestamps.ntp128BitToNanosTimestamp(NTPTimestamps.inferNtp64To128( posnd,local128))).longValue(); + //System.out.println(DsndDelayFactor+" "+DrcvDelayFactor); if (DsndDelayFactor >= 0 && DrcvDelayFactor >= 0) { monitor.setOutDelay(DsndDelayFactor); monitor.setInDelay(DrcvDelayFactor); monitor.setRecentPingNanoTime(png.getTimepingsnd()); - //pingInterval = monitor.getLatencyAvg()+2000000L; - - //double load = 1 - monitor.getOutDelayMin() / (double) monitor.getOutDelay(); - //loadPercent =Math.max( 1.3,0.4); } - LockSupport.unpark(tlock); + tlock.unpark(); break; case KLALBPacket.BWINF: BWINFPacket bwi = (BWINFPacket) kpp; - if (bwi.getDownSpeed() >= congressSpeed) { - congressSpeed = bwi.getDownSpeed(); - } else { - congressSpeed = (congressSpeed * 199 + bwi.getDownSpeed()) / 200; - } - bandwidthDistributer.setTotalBandwidth (congressSpeed ); - congress.setLimitspeed(Math.max(MIN_SPEED,(long) (congressSpeed * burstPercent)) ); - //reallimit=(int) (congress.getLimitspeed()*monitor.getLatencyMin()/1000000000L); - reallimit=(int) (Math.max(MIN_SPEED,(long) (congressSpeed*windowPercent ))*Math.max(2000000L,RTTMin)/1000000000L); - // System.out.println(congressSpeed); + algorithm.setCurrentBandwidth(bwi.getDownSpeed()); break; case KLALBPacket.ADDRREQ: - if(addressGroup!=null) - sendIPacket(new ADDRPacket(addressGroup)); + if (addressGroup != null) + sendIPacket(new ADDRPacket(addressGroup)); break; case KLALBPacket.ADDR: peerAddress = ((ADDRPacket) kpp).getAddr(); - if(addressGroup==null) { - byte[]ab=peerAddress.getAddress().getAddress(); - ab[15]=2; - Inet6AddressGroup ardg2=null; - try { - ardg2 = new Inet6AddressGroup((Inet6Address) InetAddress.getByAddress(ab),peerAddress.getPrefixLength()); - } catch (UnknownHostException e) { - e.printStackTrace(); - } - if(ardg2!=null) - addressGroup=ardg2; + if (addressGroup == null) { + byte[] ab = peerAddress.getAddress().getAddress(); + ab[15] = 2; + Inet6AddressGroup ardg2 = null; + try { + ardg2 = new Inet6AddressGroup((Inet6Address) InetAddress.getByAddress(ab), + peerAddress.getPrefixLength()); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + if (ardg2 != null) + addressGroup = ardg2; } + KLALBRemoteLine.this.onAddressUpdate(); + break; case KLALBPacket.VADDRREQ: sendIPacket(new VADDRPacket(localVaddrSupplier.get())); @@ -585,128 +455,190 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable l=srh.getTlvs(); - + + IPv6OverKLALBPacket ivk = (IPv6OverKLALBPacket) kpp; + IPv6Packet iv6 = ivk.getIPv6Packet(); + + ivk.putTimePassport("unpacked"); + ivk.printPassport(); + iv6.putTimePassport("unpackFromLink"); + + IPSequence val = null; + IPv6SegmentRoutingHeader srh = iv6.getSRHHeader(); + if (srh != null) { + List l = srh.getTlvs(); + for (int i = 0; i < l.size(); i++) { - IPv6SegmentRoutingTLV tlv=l.get(i); - if(tlv instanceof SEQSSegmentRoutingTLV) { - SEQSSegmentRoutingTLV seqs=(SEQSSegmentRoutingTLV) tlv; - // if(seqs.isPromise()) { - val=new IPSequence(seqs.getUUID(),seqs.isPromise()); - //} - - }else if(tlv instanceof ACKSEQSSegmentRoutingTLV) { - ACKSEQSSegmentRoutingTLV aseq=(ACKSEQSSegmentRoutingTLV) tlv; + IPv6SegmentRoutingTLV tlv = l.get(i); + if (tlv instanceof SEQSSegmentRoutingTLV) { + SEQSSegmentRoutingTLV seqs = (SEQSSegmentRoutingTLV) tlv; + // if(seqs.isPromise()) { + val = new IPSequence(seqs.getUUID(), seqs.isPromise()); + // } + + } else if (tlv instanceof ACKSEQSSegmentRoutingTLV) { + ACKSEQSSegmentRoutingTLV aseq = (ACKSEQSSegmentRoutingTLV) tlv; l.remove(i); i--; - - SendItem ipv6; - if((ipv6=sendMap.remove(aseq.getIPSequence()))!=null) { - sendmapWindowUsed.addAndGet((int) -(ipv6.getPacket().getPayload().getLength()+HEADER_CALIBRATE)); - long RTTC=System.nanoTime()-ipv6.getSendtime(); - if(RTTC<=RTTMin) { - RTTMin=RTTC; - }else { - RTTMin= (RTTMin*99999+RTTC)/100000; - } - if(firstUpdate.compareAndSet(true, false)) { - RTTAvg=RTTC; - RTTVar=RTTC/2; - - }else { - RTTVar=(RTTVar*3+Math.abs(RTTAvg-RTTC))/4; - RTTAvg= (RTTAvg*7+RTTC)/8; - } - RTO=RTTAvg+Math.max(MIN_RTTVAR, RTTVar*4);//RTTVar*4 - //System.out.println("remove:"+aseq.getSequence()+" "+sendMap.size()); - }else { - // System.out.println("miss:"+aseq.getSequence()+" "+sendMap.size()); - } + + sendWindow.ack(aseq.getIPSequence()); } } - } - if(val!=null) + } + if (val != null) ackIDs.add(val); - /*if(val!=null&&peerAddress!=null) { - UUID val2=val; - HighPerformanceExecutor.defaultExecutor.execute(()->{ - IPv6Packet ipv=new IPv6Packet(); - ipv.setVersion(6); - ipv.setTrafficClass(0); - ipv.setFlowLabel(0); - ipv.setHopLimit(255); - ipv.setSourceAddress(addressGroup.getAddress()); - ipv.setDestinationAddress(peerAddress.getAddress()); - ipv.setPriority(0); - ipv.enableECN(); - IPv6SegmentRoutingHeader srh2=new IPv6SegmentRoutingHeader(); - srh2.getAddresses().add(peerAddress.getAddress()); - - srh2.getTlvs().add(new ACKSEQSSegmentRoutingTLV(val2,true)); - - ipv.getHeaders().add(srh2); - ipv.setPayload(new IPv6EmptyPayload()); - - sendIPacket(new IPv6OverKLALBPacket( ipv)); - //System.out.println("ack:"+val); - }); - }*/ - - if(ipv6con!=null) { - if(iv6.getPayload()instanceof IPv6EmptyPayload) { - //iv6.dispose(); - }else { - if(val!=null) { - /*Long l=recvedUIDMap.putIfAbsent(val.getUuid(), System.nanoTime()); - if(l==null) {*/ - ipv6con.accept(iv6); - //} - }else { - ipv6con.accept(iv6); + if (checkACKTime() || ackIDs.size() >= 20) + sendALLIPv6ACK(); + + if (ipv6con != null) { + if (iv6.getPayload() instanceof IPv6EmptyPayload) { + // iv6.dispose(); + } else { + if (val != null) { + /* + * Long l=recvedUIDMap.putIfAbsent(val.getUuid(), System.nanoTime()); + * if(l==null) { + */ + ipv6con.accept(iv6); + // } + } else { + ipv6con.accept(iv6); } } } break; default: - if(rec!=null) - rec.accept( kpp); + if (rec != null) + rec.accept(kpp); break; } - }); - Thread.yield(); + }); + } + } catch (StreamCorruptedException sce) { + sce.printStackTrace(); + } catch (IOException | UnresolvedAddressException e) { + if (debug) + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + }finally { + try { + if (kplink != null) + kplink.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + private class StateManager implements Runnable { + + @Override + public void run() { + while (true) { + try { + + monitor.setState(MonitorData.CONNECTING); + if (socketAddress == null) { + if (kplink.isClosed()) { + close(); + break; + } + if (addressGroup == null) { + byte[] addr = new byte[16]; + SecureRandom scr = new SecureRandom(); + scr.nextBytes(addr); + addr[0] = (byte) 0x24; + addr[1] = (byte) 0x86; + addr[2] = 0; + addr[3] = 2; + addr[14] = 0; + addr[15] = 1; + Inet6Address i6a = (Inet6Address) Inet6Address.getByAddress(addr); + addressGroup = new Inet6AddressGroup(i6a, 112); + } + } else { + kplink = KLALBUtils.createKLALBPacketLink(bindAddress, socketAddress, true); } - }catch(StreamCorruptedException sce) { - sce.printStackTrace(); + // startRecord(); + + if (klalbController != null) { + + kplink.setInputTrafficCounters(new LongAdder[] { monitor.getInTrafficAL(), + klalbController.getLinkMonitor().getInTrafficAL() }); + kplink.setOutputTrafficCounters(new LongAdder[] { monitor.getOutTrafficAL(), + klalbController.getLinkMonitor().getOutTrafficAL() }); + kplink.setInputPacketsCounters(new LongAdder[] { monitor.getInPacketCounterAL(), + klalbController.getLinkMonitor().getInPacketCounterAL() }); + kplink.setOutputPacketsCounters(new LongAdder[] { monitor.getOutPacketCounterAL(), + klalbController.getLinkMonitor().getOutPacketCounterAL() }); + } else { + kplink.setInputTrafficCounters(new LongAdder[] { monitor.getInTrafficAL() }); + kplink.setOutputTrafficCounters(new LongAdder[] { monitor.getOutTrafficAL() }); + kplink.setInputPacketsCounters(new LongAdder[] { monitor.getInPacketCounterAL() }); + kplink.setOutputPacketsCounters(new LongAdder[] { monitor.getOutPacketCounterAL() }); + } + kplink.setSoTimeout(20000); + + algorithm = new LARCCongressAlgorithm(); + // algorithm=new BBRCongressAlgorithm(); + algorithm.setSpeedControlConsumer((speed, bursttime) -> { + speedLimit.setLimitspeed(speed); + speedLimit.setBrustTime(bursttime); + }); + algorithm.reset(); + + sendWindow = new SendPacketSlidingWindow(algorithm, 65535, + HEADER_CALIBRATE); + sendWindow.setResendConsumer(rerouteConsumer); + sendWindow.setClosingConsumer(rerouteConsumer); + algorithm.setWindowControlConsumer((sendwindow) -> { + sendWindow.setWindowSize(sendwindow); + }); + + + kplink.setSoTimeout(3000); + + Thread timer = ThreadTool.makeVDaemonThread("重路由计时器线程", new RerouteChecker()); + timer.start(); + + Thread t = ThreadTool.makeVDaemonThreadIfSupport("远程发送线程", new RemoteSender()); + t.start(); + + RemoteReceiver recvr=new RemoteReceiver(); + int cores=Runtime.getRuntime().availableProcessors(); + for(int i=0;i<1;i++) { + ThreadTool.makeVDaemonThreadIfSupport("远程接收线程", recvr).start(); + } + + while(!kplink.isClosed()) { + Thread.sleep(10); + } + } catch (StreamCorruptedException sce) { + sce.printStackTrace(); } catch (IOException | UnresolvedAddressException e) { if (debug) e.printStackTrace(); - }catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } finally { monitor.setState(MonitorData.OFFLINE); + onOnlineStateUpdate(); pressure = false; try { if (kplink != null) @@ -714,14 +646,8 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparablevals= sendMap.values(); - SendItem[]packs= vals.toArray(new SendItem[0]); - for (SendItem iPv6Packet : packs) { - rerouteConsumer.accept(iPv6Packet.getPacket()); - //System.out.println("重路由:"+iPv6Packet); - } - sendMap.clear(); - sendmapWindowUsed.set(0); + if (sendWindow != null) + sendWindow.close(); } if (closed) { @@ -729,100 +655,117 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable ackIDs=new ConcurrentLinkedQueue<>(); - private volatile long prevAckTime=System.nanoTime(); - private volatile long ackInterval=1000000L; + + public void ping() throws IOException { + + PINGPacket ping=new PINGPacket(sysclk.getCurrentTimeNTP64().longValue()); + /*Long128 local=sysclk.getCurrentTimeNanos(); + BigInteger local128= NTPTimestamps.nanosToNtp128BitTimestamp(local); + System.out.println("psnd0"+NTPTimestamps.nanosSince1970ToString( NTPTimestamps.ntp128BitToNanosTimestamp( NTPTimestamps.inferNtp64To128( ping.getTime(),local128))));*/ + writeKLALBPacketToKPL(ping); + } + + private ConcurrentLinkedQueue ackIDs = new ConcurrentLinkedQueue<>(); + private volatile long prevAckTime = System.nanoTime(); + private volatile long ackInterval = 100000L; + private boolean checkACKTime() { long cu = System.nanoTime(); - if (cu - prevAckTime > ackInterval) { + if (cu - prevAckTime > ackInterval) { prevAckTime = cu; return true; } else { return false; } } + private void sendALLIPv6ACK() { - if(peerAddress!=null) { - while(true) { - int rez=sendIPv6ACK(); - if(rez<=0) - break; + if (peerAddress != null) { + while (true) { + int rez = sendIPv6ACK(); + if (rez <= 0) + break; + } } - } - } - private int sendIPv6ACK() { - IPv6SegmentRoutingHeader srh2=new IPv6SegmentRoutingHeader(); - int adds=addACKSEQToSRH(srh2,40); - if(adds<=0) - return adds; - - //System.out.println(adds+"ACKS"); - - IPv6Packet ipv=new IPv6Packet(); - ipv.setVersion(6); - ipv.setTrafficClass(0); - ipv.setFlowLabel(0); - ipv.setHopLimit(255); - ipv.setSourceAddress(addressGroup.getAddress()); - ipv.setDestinationAddress(peerAddress.getAddress()); - ipv.setPriority(0); - ipv.enableECN(); - srh2.getAddresses().add(peerAddress.getAddress()); - - - ipv.getHeaders().add(srh2); - ipv.setPayload(new IPv6EmptyPayload()); - - sendIPacket(new IPv6OverKLALBPacket( ipv)); - //System.out.println("ack:"+val); - return adds; } - private int addACKSEQToSRH(IPv6SegmentRoutingHeader srh,int maxAckCount){ + private int sendIPv6ACK() { + IPv6SegmentRoutingHeader srh2 = new IPv6SegmentRoutingHeader(); + int adds = addACKSEQToSRH(srh2, 20); + if (adds <= 0) + return adds; + + // System.out.println(adds+"ACKS"); + + IPv6Packet ipv = new IPv6Packet(); + ipv.setVersion(6); + ipv.setTrafficClass(0); + ipv.setFlowLabel(0); + ipv.setHopLimit(255); + ipv.setSourceAddress(addressGroup.getAddress()); + ipv.setDestinationAddress(peerAddress.getAddress()); + ipv.setPriority(0); + ipv.enableECN(); + srh2.getAddresses().add(peerAddress.getAddress()); + + ipv.getHeaders().add(srh2); + ipv.setPayload(new IPv6EmptyPayload()); + + sendIPacket(new IPv6OverKLALBPacket(ipv)); + // System.out.println("ack:"+val); + return adds; + } + + private int addACKSEQToSRH(IPv6SegmentRoutingHeader srh, int maxAckCount) { int i = 0; for (; i < maxAckCount; i++) { - - IPSequence ackid= ackIDs.poll(); - if(ackid!=null) { + + IPSequence ackid = ackIDs.poll(); + if (ackid != null) { srh.getTlvs().add(new ACKSEQSSegmentRoutingTLV(ackid, ackid.isPromise())); - }else { - prevAckTime=System.nanoTime(); + } else { + prevAckTime = System.nanoTime(); return i; } } return i; } - + private void flushKPL() throws IOException { kplink.flush(); } private KLALBPacket readKLALBPacketFromKPL() throws IOException { KLALBPacket packet = kplink.readKLALBPacket(); - debugShowPacket("RX",packet); + debugShowPacket("RX", packet); if (packet != null) { - packet.putTimePassport("received"); - + packet.putTimePassport("received"); + } return packet; } private void writeKLALBPacketToKPL(KLALBPacket packet) throws IOException { + if (packet instanceof TESTNPacket) + System.err.println(packet); kplink.writeKLALBPacket(packet); packet.putTimePassport("sended"); packet.printPassport(); - debugShowPacket("TX",packet); + debugShowPacket("TX", packet); } private void debugShowPacket(String label, KLALBPacket packet) { @@ -830,10 +773,10 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable pingInterval) { - time = cu; - return true; - } else { - return false; - } - + if (cu - time > pingInterval) { + time = cu; + return true; + } else { + return false; + } + } private boolean checkPingTimeSleep() { long cu = System.nanoTime(); - if (cu - time > pingIntervalSleep) { - time = cu; - return true; - } else { - return false; + if (cu - time > pingIntervalSleep) { + time = cu; + return true; + } else { + return false; + } + } - - } - private volatile long bwtime = System.nanoTime(); private volatile long bwpingInterval = 10000000L; private volatile long bwpingIntervalSleep = 200000000L; - private boolean checkBandwidthReportTime(){ + + private boolean checkBandwidthReportTime() { long cu = System.nanoTime(); - if (cu - bwtime > bwpingIntervalSleep) { - bwtime = cu; - return true; - } else { - return false; + if (cu - bwtime > bwpingIntervalSleep) { + bwtime = cu; + return true; + } else { + return false; + } + } - - } - + private volatile Consumer rec; - private volatile Thread tlock; + // private volatile Thread tlock; + private ThreadParker tlock = new ThreadParker(); private ConcurrentLinkedQueue IsendDequeList = new ConcurrentLinkedQueue(); - private PriorityBlockingQueue sendDequeList = new PriorityBlockingQueue(); - - public PriorityBlockingQueue getQueue() { - return sendDequeList; - } + private PriorityBlockingQueue sendDequeList = new PriorityBlockingQueue(); protected void sendPacket(KLALBPacket blk) { - debugShowPacket("TX",blk); + debugShowPacket("TX", blk); blk.markJoinqueuetime(); - ByteBuffer buf=NetworkPacket.bufferAllocator.allocate((int) blk.getLength()); - try { - KLALBPacket.writeKLALBPacketToChannel(KNEChannels.newWritableChannel(buf), blk); - buf.flip(); - sendDequeList.add(buf); - LockSupport.unpark(tlock); - } catch (IOException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } + sendDequeList.add(blk); + tlock.unpark(); + speedLimit.forceTransmit(blk.getTotalLength()); } private void sendIPacket(KLALBPacket blk) { IsendDequeList.add(blk); - LockSupport.unpark(tlock); + tlock.unpark(); } - public void setPacketReceiver(Consumer< KLALBPacket> rec) { + public void setPacketReceiver(Consumer rec) { this.rec = rec; } - - - - private volatile long predictTime; - - public void runPredict() { - //predictTime = monitor.getOutDelayPredicted(); - predictTime=monitor.getOutDelay(); - /* - * long al=0; al=statLengthBefore(5); long speed=getMonitor().getOutSpeedAvg(); - * // spdlmt.setLimitspeed(speed*2+65536); if(speed==0) { if(al>0) { - * predictTime=Long.MAX_VALUE; } }else { predictTime+=al*1000000000L/speed; } - */ - } - - @Override - public int compareTo(KLALBRemoteLine o2) { - long t1 = this.predictTime; - long t2 = o2.predictTime; - if (t1 > t2) { - return 1; - } else if (t1 < t2) { - return -1; - } else { - return 0; - } - } - public void reconnectImmediately() { if (lthd != null) { LockSupport.unpark(lthd); @@ -996,11 +901,6 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable ipv6con; @Override @@ -1008,87 +908,76 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable bandwidthDistributer=new BandwidthDistributer(); - + private BandwidthDistributer bandwidthDistributer = new BandwidthDistributer(); + @Override public List getNeighborsInfo() { - Lisths=new ArrayList<>(); - if(peerAddress!=null) { - hs.add(new Neighbor(peerAddress, remoteVaddr, monitor,bandwidthDistributer)); - //System.out.println(peerAddress+" "+addressGroup); + List hs = new ArrayList<>(); + if (peerAddress != null) { + hs.add(new Neighbor(peerAddress, remoteVaddr, monitor, bandwidthDistributer)); + // System.out.println(peerAddress+" "+addressGroup); } return hs; } - - - private Map sendMap= new ConcurrentHashMap<>(1024,0.2f); - private AtomicInteger sendmapWindowUsed=new AtomicInteger(0); - private MaprecvedUIDMap=new ConcurrentHashMap(1024,0.2f); - private volatile int inputchachesize = 8192 * 4000; - private volatile int outputchachesize = 8192 * 240;//500 - private volatile int reallimit = 65536 ; + private volatile int outputchachesize = 8192 * 240;// 500 private Consumer rerouteConsumer; - + @Override public void sendPacket(IPv6Packet pack, Inet6Address inet6Address) throws IOException { - //只有已连接的链路才能传输数据 - if(monitor.getState()==MonitorData.ONLINE) { - - //if(inet6Address.equals(remoteVaddr.getAddress())||inet6Address.equals(peerAddress.getAddress())) { - - //获得数据包的SRv6扩展头部 - IPv6SegmentRoutingHeader srh= pack.getSRHHeader(); - - IPSequence val=null; - if(srh!=null) { - List l=srh.getTlvs(); + // 只有已连接的链路才能传输数据 + if (monitor.getState() == MonitorData.ONLINE) { + + // if(inet6Address.equals(remoteVaddr.getAddress())||inet6Address.equals(peerAddress.getAddress())) + // { + + // 获得数据包的SRv6扩展头部 + IPv6SegmentRoutingHeader srh = pack.getSRHHeader(); + + IPSequence val = null; + if (srh != null) { + List l = srh.getTlvs(); for (int i = 0; i < l.size(); i++) { - IPv6SegmentRoutingTLV tlv=l.get(i); - if(tlv instanceof SEQSSegmentRoutingTLV) { - SEQSSegmentRoutingTLV seqs=(SEQSSegmentRoutingTLV) tlv; - //if(seqs.isPromise()) - //获得数据包的序号 - val=new IPSequence(seqs.getUUID(),seqs.isPromise()); - + IPv6SegmentRoutingTLV tlv = l.get(i); + if (tlv instanceof SEQSSegmentRoutingTLV) { + SEQSSegmentRoutingTLV seqs = (SEQSSegmentRoutingTLV) tlv; + // if(seqs.isPromise()) + // 获得数据包的序号 + val = new IPSequence(seqs.getUUID(), seqs.isPromise()); + break; } } - - if(val!=null) { - //放入滑动窗口中并记录缓冲区大小占用 - SendItem old= sendMap.put(val,new SendItem( pack)); - if(old!=null) { - sendmapWindowUsed.addAndGet((int) -(old.getPacket().getPayload().getLength()+HEADER_CALIBRATE)); - } - sendmapWindowUsed.addAndGet((int) (pack.getPayload().getLength()+HEADER_CALIBRATE)); - //System.out.println("add: "+ val+" "+sendMap.size()); + + if (val != null) { + // 放入滑动窗口中并记录缓冲区大小占用 + sendWindow.put(val, pack); } - } - //捎带发送反方向的ACK给对方发送过来的数据包,减小设备性能开销 - if(srh!=null) { - addACKSEQToSRH(srh,10); } - //发送数据包 - sendIPv6PacketToLink(pack); - //} - - }else { - if(rerouteConsumer!=null) { - rerouteConsumer.accept(pack); + // 捎带发送反方向的ACK给对方发送过来的数据包,减小设备性能开销 + /* + * if(srh!=null) { addACKSEQToSRH(srh,10); } + */ + // 发送数据包 + sendIPv6PacketToLink(pack); + // } + + } else { + if (rerouteConsumer != null) { + rerouteConsumer.accept(pack); } } } - + @Override public void setRerouteConsumer(Consumer rerouteConsumer) { - this.rerouteConsumer=rerouteConsumer; + this.rerouteConsumer = rerouteConsumer; } - + private void sendIPv6PacketToLink(IPv6Packet pack) { - IPv6OverKLALBPacket kipv6=new IPv6OverKLALBPacket(pack); + IPv6OverKLALBPacket kipv6 = new IPv6OverKLALBPacket(pack); kipv6.setPriority(pack.getPriority()); pack.putTimePassport("packdInLink"); pack.printPassport(); @@ -1097,23 +986,25 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable3000000000L||monitor.getOutDelay()>3000000000L||monitor.getInSpeedAvg()<=0||monitor.getOutSpeedAvg()<=0) + public boolean isCongress(IPv6Packet iPv6Packet, double scale) { + SendPacketSlidingWindow sw = sendWindow; + if (sw != null) { + return sw.isCongress(iPv6Packet, scale)||(monitor.getOutDelay()/(monitor.getOutDelayMin()+1000000L)>3); + } else { return true; - boolean congress=sendmapWindowUsed.get()>reallimit*scale; - return congress; - + } } - + @Override public boolean isReachSpeedLimit(IPv6Packet iPv6Packet) { - boolean xcongress=!congress.checkTransmit(iPv6Packet.getLength()); - return xcongress; + boolean xcongress=!speedLimit.checkTransmit(iPv6Packet.getTotalLength()); + return xcongress; + //return false; } @Override @@ -1123,43 +1014,48 @@ public class KLALBRemoteLine implements IPv6NetworkLink,Comparable 3000000000L || monitor.getOutDelay() > 3000000000L + || monitor.getInSpeedAvg() <= 0 || monitor.getOutSpeedAvg() <= 0); + // System.out.println(b); + return (!isClosed()) && (getMonitor().getState() == MonitorData.ONLINE) && (!b); } @Override public void setReceiveConsumer(Consumer ipv6con) { - this.ipv6con=ipv6con; + this.ipv6con = ipv6con; } @Override public List getRouteItems() { - List rlist=new ArrayList<>(); - - Inet6AddressGroup adg=addressGroup; - if(adg!=null) - rlist.add(new RouteItem(new Inet6AddressGroup(adg.getAddress(), 128), - adg.getAddress(), this, "Direct", 0, 0, null, "D",true)); - - for (Iterator iteratorx = getNeighborsInfo() - .iterator(); iteratorx.hasNext();) { - Neighbor addresses = (Neighbor) iteratorx.next(); - RouteItem ri = new RouteItem(new Inet6AddressGroup(addresses.getAddress().getAddress(), 128), addresses.getAddress().getAddress(), - this, "Direct", 0, 128, addresses.getMonitor(), "D",false); - rlist.add(ri); - - RouteItem ris = new RouteItem(addresses.getLocator(), (Inet6Address) addresses.getLocator().getAddress(), - this, "KLALB SRv6", 13, 128, addresses.getMonitor(), "D",false); - rlist.add(ris); + List rlist = new ArrayList<>(); + Inet6AddressGroup adg = addressGroup; + if (adg != null) + rlist.add(new RouteItem(new Inet6AddressGroup(adg.getAddress(), 128), adg.getAddress(), this, "Direct", 0, + 0, null, "D", true)); + + for (Iterator iteratorx = getNeighborsInfo().iterator(); iteratorx.hasNext();) { + Neighbor addresses = (Neighbor) iteratorx.next(); + RouteItem ri = new RouteItem(new Inet6AddressGroup(addresses.getAddress().getAddress(), 128), + addresses.getAddress().getAddress(), this, "Direct", 0, 128, addresses.getMonitor(), "D", false); + rlist.add(ri); + + if (addresses.getLocator() != null) { + RouteItem ris = new RouteItem(addresses.getLocator(), + (Inet6Address) addresses.getLocator().getAddress(), this, "KLALB SRv6", 13, 128, + addresses.getMonitor(), "D", false); + rlist.add(ris); + } } return rlist; } + @Override + public void setCongressCondition(Lock lock, Condition condition) { + if (sendWindow != null) + sendWindow.setCongressCondition(lock, condition); + } + } diff --git a/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java b/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java index 6a4e2b9..0ba2f0b 100644 --- a/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java +++ b/src/org/kne/cloud/network/klalb/KLALBRemoteManagement.java @@ -11,6 +11,7 @@ import java.util.Set; import org.kne.cloud.network.MultipurposeSocketAddress; import org.kne.cloud.network.Proxy; import org.kne.cloud.network.SocketListener; +import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.monitor.MonitorData; import com.google.gson.JsonArray; @@ -64,10 +65,14 @@ public class KLALBRemoteManagement { switch (reqt) { case "GETLINES": JsonArray lines=new JsonArray(); - Listlineslist= klalbProxySystem.getKlalbController().getLines(); + Listlineslist= klalbProxySystem.getKlalbController().getLines(); synchronized (lineslist) { - for (Iterator iterator = lineslist.iterator(); iterator.hasNext();) { - KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) iterator.next(); + for (Iterator iterator = lineslist.iterator(); iterator.hasNext();) { + IPv6NetworkLink link=iterator.next(); + if(!(link instanceof KLALBRemoteLine)) { + continue; + } + KLALBRemoteLine klalbRemoteLine = (KLALBRemoteLine) link; if(klalbRemoteLine.getSocketAddress()==null) continue; JsonObject jklbrl=new JsonObject(); diff --git a/src/org/kne/cloud/network/klalb/KLALBUtils.java b/src/org/kne/cloud/network/klalb/KLALBUtils.java index 467ca84..0f4bdb1 100644 --- a/src/org/kne/cloud/network/klalb/KLALBUtils.java +++ b/src/org/kne/cloud/network/klalb/KLALBUtils.java @@ -39,8 +39,43 @@ public class KLALBUtils { public static void main(String[] args) { System.out.println(uuidToIP(new UUID(-1,-1))); } - public static String bytesUnit(long v) { - if (v >= 1024L * 1024 * 1024 * 1024 * 1024) { + + public static String convertUintNanoDefalut(long v) { + if(v>=1000L*1000L*1000L*1000L*1000L) { + return format( v/(1000.0*1000.0*1000.0*1000.0*1000.0))+"M"; + }else if(v>=1000L*1000L*1000L*1000L) { + return format (v/(1000.0*1000.0*1000.0*1000.0))+"K"; + }else if(v>=1000L*1000L*1000L) { + return format( v/(1000.0*1000.0*1000.0)); + }else if(v>=1000L*1000L) { + return format( v/(1000.0*1000.0))+"m"; + }else if(v>=1000L) { + return format( v/(1000.0))+"u"; + }else { + return Long.toString(v)+"n" ; + } + } + + public static String convertUintDefalut(long v) { + if(v>=1000L*1000L*1000L*1000L*1000L) { + return format( v/(1000.0*1000.0*1000.0*1000.0*1000.0))+"P"; + }else if(v>=1000L*1000L*1000L*1000L) { + return format (v/(1000.0*1000.0*1000.0*1000.0))+"T"; + }else if(v>=1000L*1000L*1000L) { + return format( v/(1000.0*1000.0*1000.0))+"G"; + }else if(v>=1000L*1000L) { + return format( v/(1000.0*1000.0))+"M"; + }else if(v>=1000L) { + return format( v/(1000.0))+"K"; + }else { + return Long.toString(v) ; + } + } + + + public static String convertIBUint(long v) { + return convertIUintDefalut(v)+"B"; + /*if (v >= 1024L * 1024 * 1024 * 1024 * 1024) { return String.format("%.2f", v / (1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)) + "PB"; } else if (v >= 1024L * 1024 * 1024 * 1024) { return String.format("%.2f", v / (1024.0 * 1024.0 * 1024.0 * 1024.0)) + "TB"; @@ -52,9 +87,9 @@ public class KLALBUtils { return String.format("%.2f", v / (1024.0)) + "KB"; } else { return v + "B"; - } + }*/ } - public static String bytesUnitSimp(long v) { + public static String convertIBUintSimp(long v) { if(v>=1024L*1024*1024*1024*1024) { return format( v/(1024.0*1024.0*1024.0*1024.0*1024.0))+"P"; }else if(v>=1024L*1024*1024*1024) { @@ -71,17 +106,17 @@ public class KLALBUtils { } - public static String defaultUnit(long v) { + public static String convertIUintDefalut(long v) { if(v>=1024L*1024*1024*1024*1024) { - return format( v/(1024.0*1024.0*1024.0*1024.0*1024.0))+"P"; + return format( v/(1024.0*1024.0*1024.0*1024.0*1024.0))+"Pi"; }else if(v>=1024L*1024*1024*1024) { - return format (v/(1024.0*1024.0*1024.0*1024.0))+"T"; + return format (v/(1024.0*1024.0*1024.0*1024.0))+"Ti"; }else if(v>=1024L*1024*1024) { - return format( v/(1024.0*1024.0*1024.0))+"G"; + return format( v/(1024.0*1024.0*1024.0))+"Gi"; }else if(v>=1024L*1024) { - return format( v/(1024.0*1024.0))+"M"; + return format( v/(1024.0*1024.0))+"Mi"; }else if(v>=1024L) { - return format( v/(1024.0))+"K"; + return format( v/(1024.0))+"Ki"; }else { return Long.toString(v) ; } @@ -164,9 +199,9 @@ public class KLALBUtils { if (targetAddress.supportNIO()) { if (bindAddress != null) { return new StreamChannelKLALBPacketLink(targetAddress - .connectSocketChannel(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort())); + .connectSocketChannel(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort()),buffered); } else { - return new StreamChannelKLALBPacketLink(targetAddress.connectSocketChannel()); + return new StreamChannelKLALBPacketLink(targetAddress.connectSocketChannel(),buffered); } } else { if (bindAddress != null) { @@ -192,10 +227,10 @@ public class KLALBUtils { if (bindAddress != null) { if(buffered) { return new StreamChannelKLALBPacketLink(targetAddress - .connectSocketChannel(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort(),timeout)); + .connectSocketChannel(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort(),timeout),buffered); }else { return new StreamChannelKLALBPacketLink(targetAddress - .connectSocketChannel(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort(),timeout)); + .connectSocketChannel(InetAddress.getByName(bindAddress.getHost()), bindAddress.getPort(),timeout),buffered); } } else { if(buffered) { diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramServerSocketFactory.java b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramServerSocketFactory.java new file mode 100644 index 0000000..1d88e35 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramServerSocketFactory.java @@ -0,0 +1,38 @@ +package org.kne.cloud.network.klalb; + +import java.io.IOException; +import java.net.InetAddress; + +import org.kne.cloud.network.DatagramServerSocket; +import org.kne.cloud.network.DatagramServerSocketFactory; + +public class KLALBVirtualDatagramServerSocketFactory extends DatagramServerSocketFactory { + private KLALBController controller; + + public KLALBVirtualDatagramServerSocketFactory(KLALBController controller) { + this.controller=controller; + } + + public KLALBController getController() { + return controller; + } + @Override + public DatagramServerSocket createDatagramServerSocket(int port) throws IOException { + // TODO 自动生成的方法存根 + return null; + } + + @Override + public DatagramServerSocket createDatagramServerSocket(int port, int backlog) throws IOException { + // TODO 自动生成的方法存根 + return null; + } + + @Override + public DatagramServerSocket createDatagramServerSocket(int port, int backlog, InetAddress ifAddress) + throws IOException { + // TODO 自动生成的方法存根 + return null; + } + +} diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocket.java b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocket.java new file mode 100644 index 0000000..0fb1104 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocket.java @@ -0,0 +1,46 @@ +package org.kne.cloud.network.klalb; + +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.SocketException; + +import org.kne.cloud.network.VirtualDatagramSocket; +import org.kne.cloud.network.VirtualDatagramSocketImpl; +import org.pcap4j.core.Inets; + +public class KLALBVirtualDatagramSocket extends VirtualDatagramSocket { + + private KLALBController controller; + + // 默认构造函数 + public KLALBVirtualDatagramSocket(KLALBController controller) throws SocketException { + this(controller,new InetSocketAddress(0)); + } + + // 绑定到指定Socket地址 + public KLALBVirtualDatagramSocket(KLALBController controller, SocketAddress bindaddr) throws SocketException { + super(controller.createVirtualDatagramSocketImpl()); + this.controller = controller; + if (bindaddr != null) { + bind(bindaddr); + } + } + + // 绑定到指定端口 + public KLALBVirtualDatagramSocket(KLALBController controller, int port) throws SocketException { + this(controller, port, null); + } + + // 绑定到指定端口和本地地址 + public KLALBVirtualDatagramSocket(KLALBController controller, int port, InetAddress laddr) throws SocketException { + this(controller); + if (laddr == null) { + bind(new InetSocketAddress(port)); + } else { + bind(new InetSocketAddress(laddr, port)); + } + } + + +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketFactory.java b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketFactory.java new file mode 100644 index 0000000..d6767d9 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketFactory.java @@ -0,0 +1,58 @@ +package org.kne.cloud.network.klalb; + +import java.io.IOException; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.UnknownHostException; + +import org.kne.cloud.network.DatagramSocketFactory; + +public class KLALBVirtualDatagramSocketFactory extends DatagramSocketFactory { + private KLALBController controller; + + public KLALBVirtualDatagramSocketFactory(KLALBController controller) { + this.controller=controller; + } + + public KLALBController getController() { + return controller; + } + + + @Override + public DatagramSocket createSocket() throws IOException { + return new KLALBVirtualDatagramSocket(controller,null); + } + + @Override + public DatagramSocket createSocket(String paramString, int paramInt) throws IOException, UnknownHostException { + DatagramSocket dg=new KLALBVirtualDatagramSocket(controller); + dg.connect(new InetSocketAddress(paramString, paramInt)); + return dg; + } + + @Override + public DatagramSocket createSocket(InetAddress paramInetAddress, int paramInt) throws IOException { + DatagramSocket dg=new KLALBVirtualDatagramSocket(controller); + dg.connect(paramInetAddress, paramInt); + return dg; + } + + @Override + public DatagramSocket createSocket(String paramString, int paramInt1, InetAddress paramInetAddress, int paramInt2) + throws IOException, UnknownHostException { + DatagramSocket dg=new KLALBVirtualDatagramSocket(controller,new InetSocketAddress(paramInetAddress, paramInt2)); + dg.connect(new InetSocketAddress(paramString, paramInt1)); + return dg; + } + + @Override + public DatagramSocket createSocket(InetAddress paramInetAddress1, int paramInt1, InetAddress paramInetAddress2, + int paramInt2) throws IOException { + DatagramSocket dg=new KLALBVirtualDatagramSocket(controller,new InetSocketAddress(paramInetAddress2, paramInt2)); + dg.connect(paramInetAddress1, paramInt1); + return dg; + } + +} diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketImpl.java b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketImpl.java new file mode 100644 index 0000000..e0bd262 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualDatagramSocketImpl.java @@ -0,0 +1,256 @@ +package org.kne.cloud.network.klalb; + +import java.io.IOException; +import java.net.BindException; +import java.net.DatagramPacket; +import java.net.DatagramSocketImpl; +import java.net.Inet4Address; +import java.net.Inet6Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketAddress; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.nio.BufferOverflowException; +import java.nio.ByteBuffer; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.LockSupport; + +import org.kne.cloud.network.NetworkPacket; +import org.kne.cloud.network.VirtualDatagramSocketImpl; +import org.kne.cloud.network.ipv6.IPv6Packet; +import org.kne.cloud.network.tcp.UDPPacket; +import org.kne.concurrent.HighPerformanceExecutor; +import org.kne.io.KNEChannels; + +public class KLALBVirtualDatagramSocketImpl extends VirtualDatagramSocketImpl implements BindableKLALBPacketConsumer{ + + private KLALBController controller; + + private volatile boolean closed=false; + + protected Inet6Address remoteaddr; + protected Inet6Address localaddr; + + protected int remotePort;{ + try { + localaddr=(Inet6Address) Inet6Address.getByName("::0"); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + private boolean ignoreBindCheck=false; + + private int ttl=255; + + + private volatile int inputchachesize = 1024*1024; + + public KLALBVirtualDatagramSocketImpl(KLALBController controller) { + this.controller=controller; + } + + @Override + public void setOption(int optID, Object value) throws SocketException { + // TODO 自动生成的方法存根 + + } + + @Override + public Object getOption(int optID) throws SocketException { + // TODO 自动生成的方法存根 + return null; + } + + @Override + protected void create() throws SocketException { + // TODO 自动生成的方法存根 + + } + + @Override + protected void bind(int port, InetAddress host) throws SocketException { + try { + if (host.equals(Inet4Address.getByName("0.0.0.0"))) { + host = Inet6Address.getByName("::0"); + } + } catch (UnknownHostException e) { + e.printStackTrace(); + } + if (!(host instanceof Inet6Address)) { + throw new IllegalArgumentException("invalid address type, KLALB socket can only use IPV6 virtualaddress"); + } + if ((!host.isAnyLocalAddress()) && (!host.equals(controller.getSelf().getAddress()))) { + throw new BindException("must bind to self"); + } + localaddr = (Inet6Address) host; + localPort=port; + if(!ignoreBindCheck) + controller.getDatagramPortBinder().bind(this); + controller.getDatagramPortBinder().listen(this); + } + + @Override + protected void send(DatagramPacket p) throws IOException { + UDPPacket udp=new UDPPacket(localPort, p.getPort()); + udp.getData().put(p.getData(), p.getOffset(), p.getLength()); + udp.getData().flip(); + HighPerformanceExecutor.defaultExecutor.execute(() -> { + controller.sendPacketToAddress((Inet6Address) p.getAddress(),0, udp); + }); + } + + @Override + protected int peek(InetAddress i) throws IOException { + return peekNextPacket().getSrcPort(); + } + + @Override + protected int peekData(DatagramPacket p) throws IOException { + UDPPacket pack=peekNextPacket(); + copyTo(pack, p); + return p.getPort(); + } + + @Override + protected void receive(DatagramPacket p) throws IOException { + UDPPacket pack=pollNextPacket(); + copyTo(pack, p); + } + + private void copyTo(UDPPacket pack, DatagramPacket p) throws IOException { + p.setAddress(pack.getParent().getSourceAddress()); + p.setPort(pack.getSrcPort()); + ByteBuffer buffer= ByteBuffer.wrap(p.getData(),p.getOffset(),p.getLength()); + + try { + buffer.put(pack.getData()); + pack.getData().rewind(); + }catch(BufferOverflowException e) { + + } + buffer.flip(); + p.setLength(buffer.limit()); + } + + @Override + protected void setTTL(byte ttl) throws IOException { + this.ttl=ttl; + } + + @Override + protected byte getTTL() throws IOException { + return (byte) ttl; + } + + @Override + protected void setTimeToLive(int ttl) throws IOException { + this.ttl=ttl; + } + + @Override + protected int getTimeToLive() throws IOException { + return ttl; + } + + @Override + protected void join(InetAddress inetaddr) throws IOException { + // TODO 自动生成的方法存根 + + } + + @Override + protected void leave(InetAddress inetaddr) throws IOException { + // TODO 自动生成的方法存根 + + } + + @Override + protected void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException { + // TODO 自动生成的方法存根 + + } + + @Override + protected void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) throws IOException { + // TODO 自动生成的方法存根 + + } + + @Override + protected void close() { + controller.getDatagramPortBinder().unlisten(this); + if(!ignoreBindCheck) + controller.getDatagramPortBinder().unbind(this); + closed=true; + } + + private volatile Thread parkThread; + private UDPPacket peekNextPacket() { + UDPPacket pol=null; + while(true) { + pol=recvQueue.peek(); + if(pol!=null) { + recvQueueUsed.addAndGet((int) -pol.getDataLength()); + return pol; + } + parkThread=Thread.currentThread(); + LockSupport.parkNanos(1000000L); + } + } + private UDPPacket pollNextPacket() { + UDPPacket pol=null; + while(true) { + pol=recvQueue.poll(); + if(pol!=null) { + recvQueueUsed.addAndGet((int) -pol.getDataLength()); + return pol; + } + parkThread=Thread.currentThread(); + LockSupport.parkNanos(1000000L); + } + } + + private Queue recvQueue = new ConcurrentLinkedQueue(); + private AtomicInteger recvQueueUsed=new AtomicInteger(0); + @Override + public void accept(Inet6Address t,NetworkPacket np) { + UDPPacket u=(UDPPacket) np; + if(recvQueueUsed.get()<=inputchachesize) { + if(recvQueue.offer(u)) { + recvQueueUsed.addAndGet((int) u.getDataLength()); + LockSupport.unpark(parkThread); + } + } + } + + @Override + public InetAddress getRemoteInetAddress() { + return remoteaddr; + } + + @Override + public InetAddress getLocalInetAddress() { + return localaddr; + } + + @Override + public int getPort() { + return remotePort; + } + + @Override + public void setLocalPort(int i) { + this.localPort=i; + } + + @Override + public int getLocalPort() { + return super.getLocalPort(); + } + + + +} diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocket.java b/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocket.java index d389ccd..7b3f20f 100644 --- a/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocket.java +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocket.java @@ -7,18 +7,19 @@ import java.net.SocketException; import org.kne.cloud.network.RawSocket; import org.kne.cloud.network.RawSocketImpl; import org.kne.cloud.network.VirtualRawSocket; +import org.kne.cloud.network.ipv6.LoopbackIPv6NetworkLink; import org.kne.cloud.network.srv6.SRv6Router; public class KLALBVirtualRawSocket extends VirtualRawSocket { - public KLALBVirtualRawSocket(SRv6Router controller) { + public KLALBVirtualRawSocket(LoopbackIPv6NetworkLink controller) { super(new KLALBVirtualRawSocketImpl(controller)); } - public KLALBVirtualRawSocket(SRv6Router controller,Inet6Address bindAddress) throws SocketException { + public KLALBVirtualRawSocket(LoopbackIPv6NetworkLink controller,Inet6Address bindAddress) throws SocketException { super(new KLALBVirtualRawSocketImpl(controller),bindAddress); } - public KLALBVirtualRawSocket(SRv6Router controller,Inet6Address bindAddress,int bindProtocol) throws SocketException { + public KLALBVirtualRawSocket(LoopbackIPv6NetworkLink controller,Inet6Address bindAddress,int bindProtocol) throws SocketException { super(new KLALBVirtualRawSocketImpl(controller),bindAddress,bindProtocol); } } diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocketImpl.java b/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocketImpl.java index 647a555..b76ca6a 100644 --- a/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocketImpl.java +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualRawSocketImpl.java @@ -15,6 +15,7 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.LockSupport; +import java.util.function.Consumer; import org.kne.cloud.network.ByteBufferAllocator; import org.kne.cloud.network.NetworkPacket; @@ -23,6 +24,8 @@ import org.kne.cloud.network.ThreadTool; import org.kne.cloud.network.VirtualRawSocketImpl; import org.kne.cloud.network.ipv6.IPv6Packet; import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload; +import org.kne.cloud.network.ipv6.Inet6AddressGroup; +import org.kne.cloud.network.ipv6.LoopbackIPv6NetworkLink; import org.kne.cloud.network.srv6.PacketConsumer; import org.kne.cloud.network.srv6.SRv6Router; import org.kne.concurrent.HighPerformanceExecutor; @@ -32,7 +35,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P private boolean ipHeaderInclude=false; - private SRv6Router router; + private LoopbackIPv6NetworkLink link; protected volatile Inet6Address remoteaddr; @@ -42,13 +45,13 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P private volatile int inputchachesize = 1024*1024; - protected SRv6Router getRouter() { - return router; + protected LoopbackIPv6NetworkLink getLoopbackLink() { + return link; } - public KLALBVirtualRawSocketImpl(SRv6Router router) { + public KLALBVirtualRawSocketImpl(LoopbackIPv6NetworkLink link) { super(); - this.router = router; + this.link = link; } @Override @@ -116,7 +119,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P @Override protected void close() { - router.getProtocolNumberRegister().remove(bindProtocolNumber); + link.getProtocolNumberRegister().remove(bindProtocolNumber); } @Override @@ -134,13 +137,22 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P if (!(address instanceof Inet6Address)) { throw new IllegalArgumentException("invalid address type, KLALB socket can only use IPV6 address"); } - if ((!address.isAnyLocalAddress()) && (!address.equals(router.getLocator().getAddress()))) { + if (!address.isAnyLocalAddress() ) { + boolean contains=false; + for(Inet6AddressGroup adg:link.getAddressGroups()) { + if(adg.checkMatch((Inet6Address) address)) { + contains=true; + break; + } + } + if(!contains) { throw new BindException("must bind to self"); + } } localaddr=(Inet6Address) address; this.bindProtocolNumber=protocolNumber; - if(router.getProtocolNumberRegister().putIfAbsent(protocolNumber, this)!=null) { + if(link.getProtocolNumberRegister().putIfAbsent(protocolNumber, this)!=null) { throw new BindException("protocol number already bind"); } } @@ -181,7 +193,11 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P ipv.setTrafficClass(0); ipv.setFlowLabel(0); ipv.setHopLimit(255); - ipv.setSourceAddress(router.getLocator().getAddress()); + if(!localaddr.isAnyLocalAddress()) { + ipv.setSourceAddress(localaddr); + }else { + ipv.setSourceAddress(link.getRouter().getLocator().getAddress()); + } InetAddress address= p.getAddress(); if (!(address instanceof Inet6Address)) { throw new IllegalArgumentException("invalid address type, KLALB socket can only use IPV6 address"); @@ -193,7 +209,10 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P pl.getData().put(buf); pl.getData().flip(); ipv.setPayload(pl); - router.insertSRHandRoutePacket(ipv); + Consumercons=link.getReceiveConsumer(); + if(cons!=null) { + cons.accept(ipv); + } }); } } @@ -213,7 +232,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P p.setAddress(pack.getSourceAddress()); ByteBuffer buffer= ByteBuffer.wrap(p.getData(),p.getOffset(),p.getLength()); if(ipHeaderInclude) { - + }else { try { pack.getPayload().writeToChannel(KNEChannels.newWritableChannel(buffer)); @@ -236,7 +255,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P while(true) { pol=recvQueue.peek(); if(pol!=null) { - recvQueueUsed.addAndGet((int) -pol.getPayload().getLength()); + recvQueueUsed.addAndGet((int) -pol.getPayload().getTotalLength()); return pol; } parkThread=Thread.currentThread(); @@ -248,7 +267,7 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P while(true) { pol=recvQueue.poll(); if(pol!=null) { - recvQueueUsed.addAndGet((int) -pol.getPayload().getLength()); + recvQueueUsed.addAndGet((int) -pol.getPayload().getTotalLength()); return pol; } parkThread=Thread.currentThread(); @@ -259,14 +278,14 @@ public class KLALBVirtualRawSocketImpl extends VirtualRawSocketImpl implements P private AtomicInteger recvQueueUsed=new AtomicInteger(0); @Override - public void accept(IPv6Packet packx) throws IOException { + public boolean accept(IPv6Packet packx) throws IOException { if(recvQueueUsed.get()<=inputchachesize) { if(recvQueue.offer(packx)) { - recvQueueUsed.addAndGet((int) packx.getPayload().getLength()); + recvQueueUsed.addAndGet((int) packx.getPayload().getTotalLength()); LockSupport.unpark(parkThread); } } - + return true; } } diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualServerSocket.java b/src/org/kne/cloud/network/klalb/KLALBVirtualServerSocket.java index f451354..0d8f281 100644 --- a/src/org/kne/cloud/network/klalb/KLALBVirtualServerSocket.java +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualServerSocket.java @@ -17,7 +17,7 @@ public class KLALBVirtualServerSocket extends VirtualServerSocket { private KLALBController controler; protected ServerSocketChannel channel; public KLALBVirtualServerSocket(KLALBController controler) throws IOException { - super(controler.createVirtualImpl()); + super(controler.createVirtualSocketImpl()); this.controler=controler; } diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualSocket.java b/src/org/kne/cloud/network/klalb/KLALBVirtualSocket.java index e9a7f60..ffc95df 100644 --- a/src/org/kne/cloud/network/klalb/KLALBVirtualSocket.java +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualSocket.java @@ -18,7 +18,7 @@ public class KLALBVirtualSocket extends VirtualSocket { protected SocketChannel channel; public KLALBVirtualSocket(KLALBController controler) throws SocketException { - super(controler.createVirtualImpl()); + super(controler.createVirtualSocketImpl()); this.controller = controler; } diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketChannel.java b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketChannel.java index f8fcd06..5b3e0ea 100644 --- a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketChannel.java +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketChannel.java @@ -155,4 +155,8 @@ public class KLALBVirtualSocketChannel extends SocketChannel{ public void setAutoFlush(boolean b) throws IOException { ((KVSIOutputStream)socket.getOutputStream()).setAutoFlush(b); } + + public void flush() throws IOException { + ((KVSIOutputStream)socket.getOutputStream()).flush(); + } } diff --git a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java index e01ccbc..92f0a1d 100644 --- a/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java +++ b/src/org/kne/cloud/network/klalb/KLALBVirtualSocketImpl.java @@ -56,11 +56,16 @@ import java.util.zip.GZIPInputStream; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; +import org.kne.cloud.network.NetworkPacket; import org.kne.cloud.network.PortPair; import org.kne.cloud.network.SpeedLimiter; import org.kne.cloud.network.ThreadTool; import org.kne.cloud.network.VirtualSocketImpl; +import org.kne.cloud.network.congress.CongressAlgorithm; +import org.kne.cloud.network.congress.ECNCongressAlgorithm; +import org.kne.cloud.network.congress.LARCCongressAlgorithm; import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl; +import org.kne.concurrent.HighPerformanceExecutor; import org.kne.concurrent.SpinLock; import org.kne.concurrent.ThreadParker; import org.kne.debug.TimeDebugger; @@ -69,10 +74,10 @@ import org.kne.io.Data; import com.google.gson.internal.Pair; import java.util.*; - + public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements BindableKLALBPacketConsumer{ - private static final int HEADER_CALIBRATE = 40; + private static final int HEADER_CALIBRATE = 80; /* private PrintStream dbg; { @@ -84,6 +89,9 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl } */ + + + private static final boolean debug = false; private SpeedAndTrafficAndDelayMonitorDataImpl socketMonitor=new SpeedAndTrafficAndDelayMonitorDataImpl(); @@ -94,13 +102,13 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl //60000 30 30 - private final int MTU=60000; - private final long MIN_RTTVAR=100000000L; - private final long MIN_LIMIT_SPEED=64*1024L; + private final int MTU=8192; + private final long MIN_RTTVAR=200000000L; + private final long MIN_LIMIT_SPEED=128*1024L; private final long REACK_INTERVAL = 100000000L; - private SpeedLimiter spdlmt=new SpeedLimiter(MIN_LIMIT_SPEED,2000000L); + private SpeedLimiter spdlmt=new SpeedLimiter(MIN_LIMIT_SPEED,1000000L); protected Inet6Address remoteaddr; protected Inet6Address localaddr;{ @@ -156,24 +164,15 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl private int inputchachesize =128* 1024*1024; private int outputchachesize = 128* 1024*1024; - //long pad0,pad1,pad2,pad3,pad4,pad5,pad6,pad7; - //4000 100 100 - //10000 500 500//500 - private volatile long congressWindowSize = MTU * 40; - private volatile long sendWindowSize = MTU * 40; - private volatile long rcvSpeed=MIN_LIMIT_SPEED; - private volatile long requestSpeed=MIN_LIMIT_SPEED; + private volatile long congressWindowSize = MTU * 10; + private volatile long sendWindowSize = MTU * 100; + private volatile long requestSpeedOld=MIN_LIMIT_SPEED; - //private volatile long congressSpeed=0; - private volatile double congressFactor=2; - - //private double[] congressFactors=new double[] {0.95,0.95,0.95,1.2,0.8}; - //private int congressFactorsState=0; - //private volatile double maxutilization=0.8; + @@ -182,18 +181,12 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl private long outputcount = 0; - private volatile long RTTMin=1000000000L; - private volatile long RTTVar=1000000000L; - private volatile long RTTAvg=1000000000L; - private volatile long RTO=1000000000L; - - private volatile long QueueingAvg=1000000000L; //private volatile long RunningSpeed=spdlmt.getLimitspeed(); - + private CongressAlgorithm algorithm=new ECNCongressAlgorithm(); @@ -238,21 +231,21 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl try { long x=System.nanoTime(); long dt=x-dtp.resendtimer; - long limit= (long) (Math.pow(2, dtp.getSendCounter()-1)*(RTO*2)); + long limit= (long) ((1<< (dtp.getSendCounter()-1))*(algorithm.getRTO()*2)); if(dt>limit) { if(dtp.getSendCounter()>=10) { throw new IOException("send error!"); } - + HighPerformanceExecutor.defaultExecutor.execute(() -> { dtp.setPriority(4); - long length= dtp.getLength(); - socketRawMonitor.getOutTrafficAL().addAndGet(length); + long length= dtp.getTotalLength(); + socketRawMonitor.getOutTrafficAL().add(length); spdlmt.forceTransmit(length); controller.sendPacketToAddress((Inet6Address) remoteaddr,0,dtp,1); //System.out.println("第"+(dtp.getSendCounter()-1)+"次重传:"+dtp+" "+dt+">"+limit); dtp.resendtimer=x; - + }); /*if(congressWindowSize>65535) { congressWindowSize-=(dtp.getSize()+HEADER_CALIBRATE); @@ -283,19 +276,12 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl @Override public void run() { - try { if(getLocalPort()!=0&&getPort()!=0) if(remoteaddr instanceof Inet6Address&&(!remoteaddr.isAnyLocalAddress())) + HighPerformanceExecutor.defaultExecutor.execute(() -> { controller.sendPacketToAddress((Inet6Address) remoteaddr,0, new ACKTPacket(getLocalPort(),getPort(), -1, getAvaliableRcvWindow(),false,socketMonitor.getInSpeedMax(),0)); - } catch (IOException e) { - try { - close0(true); - } catch (IOException e1) { - e1.printStackTrace(); - } - e.printStackTrace(); - } + }); } @@ -437,8 +423,25 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl //System.out.println(c); spdlmt.setLimitspeed(Math.max(MIN_LIMIT_SPEED,c)); }); - updateBandwidthReq(requestSpeed); - + //updateBandwidthReq(MIN_LIMIT_SPEED); + algorithm.setSpeedControlConsumer((speed,burst)->{ + if(debug) + System.out.println("speed:"+speed); + if(portp!=null) { + if(speed>requestSpeedOld*1.01||speed{ + if(debug) + System.out.println("window:"+window); + congressWindowSize=window; + updateWindowSize(); + }); + algorithm.reset(); this.portp=portpx; }catch(SocketTimeoutException e) { @@ -450,7 +453,6 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl }finally { connectionPending=false; } - controller.getResendTimer().schedule(flowControlTask, 5000, 5000); } private void updateBandwidthReq(long requestSpeed) { @@ -477,7 +479,7 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl if (!(host instanceof Inet6Address)) { throw new IllegalArgumentException("invalid address type, KLALB socket can only use IPV6 virtualaddress"); } - if ((!host.isAnyLocalAddress()) && (!host.equals(controller.getSelf()))) { + if ((!host.isAnyLocalAddress()) && (!host.equals(controller.getSelf().getAddress()))) { throw new BindException("must bind to self"); } localaddr = (Inet6Address) host; @@ -577,10 +579,10 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl } //System.out.println("PULL:"+dtp2); dataPack = dtp2; - socketMonitor.getInTrafficAL().addAndGet(dtp2.getSize()); - socketMonitor.getInPacketCounterAL().incrementAndGet(); - controller.getDatatMonitor().getInTrafficAL().addAndGet(dtp2.getSize()); - controller.getDatatMonitor().getInPacketCounterAL().incrementAndGet(); + socketMonitor.getInTrafficAL().add(dtp2.getSize()); + socketMonitor.getInPacketCounterAL().add(1); + controller.getDatatMonitor().getInTrafficAL().add(dtp2.getSize()); + controller.getDatatMonitor().getInPacketCounterAL().add(1); //checkFlowControl(dtp2); break; @@ -987,58 +989,50 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl tt.cancel(); tt=null; } - //TimeDebugger td=new TimeDebugger(); - //td.putTime("start"); dataPack.putTimePassport("packed"); - /*while (!avaliable) { - sendthread.parkNanos(1000000L); - }*/ dataPack.putTimePassport("waitForAvaliable"); - //td.putTime("waitForAvaliable"); while(true){ if (isClosed()) throw new SocketException("Socket is closed"); - //System.out.println(sendmap.size()); boolean b=sendmapWindowUsed.get()<=sendWindowSize; - //boolean b=sendmap.size()<=reallimit/MTU; if(b) break; sendthread.parkNanos(1000000L); } dataPack.putTimePassport("waitForWindow"); - //td.putTime("waitForCache"); DATATPacket pack=dataPack; dataPack=null; pack.getDataBuffer().flip(); - //System.out.println(pack.getDataBuffer()); - //cacheCreateTime=System.nanoTime(); - //td.putTime("flipBuffer"); + + spdlmt.transmit(pack.getDataBuffer().limit()); - socketMonitor.getOutTrafficAL().addAndGet(pack.getDataBuffer().limit()); - socketMonitor.getOutPacketCounterAL().incrementAndGet(); - controller.getDatatMonitor().getOutTrafficAL().addAndGet(pack.getDataBuffer().limit()); - controller.getDatatMonitor().getOutPacketCounterAL().incrementAndGet(); - //td.putTime("doStatistic"); + HighPerformanceExecutor.defaultExecutor.execute(() -> { + DATATPacket prv= sendmap.put(pack.getNumber(),pack); + long wu=sendmapWindowUsed.addAndGet((int) (pack.getTotalLength()+HEADER_CALIBRATE)); + if(prv!=null) { + wu=sendmapWindowUsed.addAndGet((int) (-(prv.getTotalLength()+HEADER_CALIBRATE))); + } + algorithm.setCurrentWindowUsed(wu ); + if(debug) + System.out.println("windowused:"+wu); + + + socketMonitor.getOutTrafficAL().add(pack.getDataBuffer().limit()); + socketMonitor.getOutPacketCounterAL().add(1); + controller.getDatatMonitor().getOutTrafficAL().add(pack.getDataBuffer().limit()); + controller.getDatatMonitor().getOutPacketCounterAL().add(1); + pack.setPriority(5); pack.resendtimer=System.nanoTime(); - socketRawMonitor.getOutTrafficAL().addAndGet(pack.getLength()); + socketRawMonitor.getOutTrafficAL().add(pack.getTotalLength()); controller.sendPacketToAddress(remoteaddr,0,pack); - //td.putTime("doSend"); - /* sendmaplock.readLock().lock(); - try{*/ - DATATPacket prv= sendmap.put(pack.getNumber(),pack); - sendmapWindowUsed.addAndGet((int) (pack.getLength()+HEADER_CALIBRATE)); - if(prv!=null) - sendmapWindowUsed.addAndGet((int) (-(prv.getLength()+HEADER_CALIBRATE))); - //System.out.println("PUSH:"+pack); - /*}finally { - sendmaplock.readLock().unlock(); - }*/ - //td.putTime("addToList"); + }); + + + + - //td.putTime("newPacket"); - //td.print(); } } @@ -1066,12 +1060,14 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl DATATPacket pack=new DATATPacket(localport, port, outputcount++,MTU); pack.setPriority(5); pack.getDataBuffer(). flip(); + HighPerformanceExecutor.defaultExecutor.execute(() -> { controller.sendPacketToAddress(remoteaddr,0,pack); + }); /*sendmaplock.readLock().lock(); try{*/ pack.resendtimer=System.nanoTime(); sendmap.put(pack.getNumber(),pack); - sendmapWindowUsed.addAndGet((int) (pack.getLength()+HEADER_CALIBRATE)); + sendmapWindowUsed.addAndGet((int) (pack.getTotalLength()+HEADER_CALIBRATE)); /*}finally { sendmaplock.readLock().unlock(); }*/ @@ -1173,11 +1169,11 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl @Override protected void close() throws IOException { close0(true); - -//new Exception().printStackTrace(); } private void close0(boolean b) throws IOException { + +//new Exception().printStackTrace(); if ( !isClosed()) { closed = true; @@ -1185,12 +1181,11 @@ public class KLALBVirtualSocketImpl extends VirtualSocketImpl implements Bindabl sendCheckTask.cancel(); flowControlTask.cancel(); if(b) - if(remoteaddr!=null) - try { - + if(remoteaddr!=null) { + HighPerformanceExecutor.defaultExecutor.execute(() -> { controller.sendPacketToAddress(remoteaddr,0, new RSTPacket(super.localport, super.port), 2); - } catch (NoRouteToHostException e) { + }); } controller.getStreamPortBinder().disconnect(this); if(portp!=null) { @@ -1496,7 +1491,8 @@ public void associateSocketChannel(SocketChannel b) throws IOException{ } @Override - public void accept(Inet6Address from, KLALBPacket u) { + public void accept(Inet6Address from,NetworkPacket np) { + KLALBPacket u=(KLALBPacket) np; try { //System.out.println(this+" "+u); switch (u.getType()) { @@ -1544,14 +1540,14 @@ public void associateSocketChannel(SocketChannel b) throws IOException{ } private void acceptDATA(Inet6Address from, DATATPacket dtp) throws BindException, IOException { - socketRawMonitor.getInTrafficAL().addAndGet(dtp.getLength()); + socketRawMonitor.getInTrafficAL().add(dtp.getTotalLength()); if(isListening()) { if(dtp.getNumber()==0) { backlogQueuelock.lock(); try{ //controller.getStreamPortBinder().checkIsConnected(new Pair); - InetSocketAddress is=new InetSocketAddress(from, dtp.getSport()); + InetSocketAddress is=new InetSocketAddress(from, dtp.getSrcPort()); AtomicBoolean ab=new AtomicBoolean(true); for (Iterator iterator = backlogQueue.iterator(); iterator.hasNext();) { Object[] objects = (Object[]) iterator.next(); @@ -1561,7 +1557,7 @@ public void associateSocketChannel(SocketChannel b) throws IOException{ } } if(ab.get()) { - if(controller.getStreamPortBinder().checkIsConnect(this,new InetSocketAddress(from, dtp.getSport()))) { + if(controller.getStreamPortBinder().checkIsConnect(this,new InetSocketAddress(from, dtp.getSrcPort()))) { ab.set(false); } } @@ -1572,8 +1568,10 @@ public void associateSocketChannel(SocketChannel b) throws IOException{ /* controller.sendPacketToAddress(from.getRemoteVaddr(), new ACKTPacket(dtp.getDport(), dtp.getSport(),dtp.getNumber(),true,0), 0,2);*/ }else { - controller.sendPacketToAddress(from,0, new RSTPacket(dtp.getDport(), dtp.getSport()), + HighPerformanceExecutor.defaultExecutor.execute(() -> { + controller.sendPacketToAddress(from,0, new RSTPacket(dtp.getDstPort(), dtp.getSrcPort()), 2); + }); } @@ -1581,14 +1579,17 @@ public void associateSocketChannel(SocketChannel b) throws IOException{ backlogQueuelock.unlock(); } }else { - controller.sendPacketToAddress(from,0, new RSTPacket(dtp.getDport(), dtp.getSport()), + HighPerformanceExecutor.defaultExecutor.execute(() -> { + controller.sendPacketToAddress(from,0, new RSTPacket(dtp.getDstPort(), dtp.getSrcPort()), 2); + }); } }else { //System.out.println(dtp.isCE()); - controller.sendPacketToAddress(from,0, new ACKTPacket(dtp.getDport(), dtp.getSport(), dtp.getNumber(), - getAvaliableRcvWindow(),dtp.isCE(),socketMonitor.getInSpeedMax(),dtp.getSendcount()), 1); - + HighPerformanceExecutor.defaultExecutor.execute(() -> { + controller.sendPacketToAddress(from,0, new ACKTPacket(dtp.getDstPort(), dtp.getSrcPort(), dtp.getNumber(), + getAvaliableRcvWindow(),dtp.isCE(),socketMonitor.getInSpeedAvg(),dtp.getSendcount()), 1); + }); boolean added=false; long number=dtp.getNumber(); @@ -1624,138 +1625,47 @@ public void associateSocketChannel(SocketChannel b) throws IOException{ private void acceptACK(Inet6Address from, ACKTPacket ackt) throws IOException { if(isListening()) { - controller.sendPacketToAddress(from,0, new RSTPacket(ackt.getDport(), ackt.getSport()), + HighPerformanceExecutor.defaultExecutor.execute(() -> { + controller.sendPacketToAddress(from,0, new RSTPacket(ackt.getDstPort(), ackt.getSrcPort()), 2); + }); }else { peerAvaliableRcvWindow = ackt.getAvaliableRcvWindow(); updateWindowSize(); + long bwrcv=ackt.getRcvSpeed(); + if(debug) + System.out.println("bwrcv:"+bwrcv); + algorithm.setCurrentBandwidth(bwrcv); - rcvSpeed=ackt.getRcvSpeed(); - - /*if(rcvSpeed>=congressSpeed) { - congressSpeed=rcvSpeed; - }else { - congressSpeed=(congressSpeed*99+rcvSpeed)/100; - }*/ - requestSpeed=(long) (Math.max(MIN_LIMIT_SPEED, rcvSpeed)*congressFactor); - if(portp!=null) { - if(requestSpeed>requestSpeedOld*1.01||requestSpeedswu) { - cachesizenew=(int) swu; - } - - }while(congresscachesize.compareAndSet(cachesizeold, cachesizenew)); - - //System.out.println(reallimit+" +1024"); - - }*/ - if(ackt.isCongress()) { - congressFactor=1.5; - if(congressWindowSize>65535) { - congressWindowSize-=(kl.getSize()+HEADER_CALIBRATE)/8; - updateWindowSize(); - //System.out.println(reallimit+" -8192"); - } - }else { - if(sendmapWindowUsed.get()*2L>=congressWindowSize&&congressWindowSize<=outputchachesize) { - congressWindowSize+=(kl.getSize()+HEADER_CALIBRATE)/32; - updateWindowSize(); - //System.out.println(reallimit+" +1024"); - } - } - //controller.removeFromSend(from.getRemoteVaddr(),kl); + + if(kl.getSendCounter()==1) { long RTTC=ackt.getRcvtime()- kl.getSndtime(); - if(RTTC<=RTTMin) { - RTTMin=RTTC; - }else { - RTTMin= (RTTMin*99999+RTTC)/100000; - } - - long queueing=RTTC-RTTMin; - QueueingAvg=(QueueingAvg*99999+queueing)/100000; - - if(firstUpdate.compareAndSet(true, false)) { - RTTAvg=RTTC; - RTTVar=RTTC/2; - - }else { - RTTVar=(RTTVar*3+Math.abs(RTTAvg-RTTC))/4; - RTTAvg= (RTTAvg*7+RTTC)/8; - } - RTO=RTTAvg+Math.max(MIN_RTTVAR, RTTVar*4);//RTTVar*4 - - - - /*if(RTTC>RTO) { - congressFactor=Math.min( 0.9,congressFactor); - }else { - if(congressFactor<1.1) - congressFactor+=0.001; - } */ - - - //System.out.println(congressFactor); - //spdlmt.setLimitspeed(1024*1024); - //reallimit=Math.max(MTU*2,(int) (congressSpeed*RTTMin*4/1000000000L)); - //System.out.println(reallimit/MTU); - /*long nspd=(long) (congressSpeed*congressFactor); - spdlmt.setLimitspeed(Math.max(nspd,MIN_LIMIT_SPEED));*/ - - - // System.out.println("RwqSpeed:"+(requestSpeed/1024)+"K MaxSpeed:"+(congressSpeed/1024)+"K LimitSpeed:"+(spdlmt.getLimitspeed()/1024)+"K"); - //System.out.println("RTTMin:"+RTTMin/1000000L+"ms RTTAvg:"+RTTAvg/1000000L+"ms"); - - + algorithm.putAck(kl.getTotalLength(), RTTC,ackt.isCongress()); } - //kl.dispose(); } } - //ackt.dispose(); } private void updateWindowSize() { diff --git a/src/org/kne/cloud/network/klalb/MonitoredChannel.java b/src/org/kne/cloud/network/klalb/MonitoredChannel.java new file mode 100644 index 0000000..c71a8a5 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/MonitoredChannel.java @@ -0,0 +1,54 @@ +package org.kne.cloud.network.klalb; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.Channel; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.util.concurrent.atomic.AtomicLong; + +public class MonitoredChannel implements Channel,ReadableByteChannel ,WritableByteChannel{ + + private Channel channel; + private AtomicLong[] totalIn; + private AtomicLong[] totalOut; + + public MonitoredChannel (Channel channel,AtomicLong[] totalIn,AtomicLong[] totalOut) { + this.channel=channel; + this.totalIn=totalIn; + this.totalOut=totalOut; + } + + public Channel getChannel() { + return channel; + } + + @Override + public boolean isOpen() { + return channel.isOpen(); + } + + @Override + public void close() throws IOException { + channel.close(); + } + + @Override + public int write(ByteBuffer src) throws IOException { + int count=((WritableByteChannel)channel).write(src); + for(AtomicLong x:totalOut) + x.addAndGet(count); + return count; + } + + @Override + public int read(ByteBuffer dst) throws IOException { + int count=((ReadableByteChannel)channel).read(dst); + if(count!=-1) { + for(AtomicLong x:totalIn) + x.incrementAndGet(); + } + return count; + } + +} diff --git a/src/org/kne/cloud/network/klalb/MonitoredInputStream.java b/src/org/kne/cloud/network/klalb/MonitoredInputStream.java index 137b07f..296d9ca 100644 --- a/src/org/kne/cloud/network/klalb/MonitoredInputStream.java +++ b/src/org/kne/cloud/network/klalb/MonitoredInputStream.java @@ -4,11 +4,12 @@ import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; public class MonitoredInputStream extends FilterInputStream { - private AtomicLong[] total; - public MonitoredInputStream(InputStream inputStream,AtomicLong... v) { + private LongAdder[] total; + public MonitoredInputStream(InputStream inputStream,LongAdder... v) { super(inputStream); this.total=v; } @@ -17,8 +18,8 @@ public class MonitoredInputStream extends FilterInputStream { public int read() throws IOException { int v=in.read(); if(v!=-1) { - for(AtomicLong x:total) - x.incrementAndGet(); + for(LongAdder x:total) + x.add(1); } return v; } @@ -27,8 +28,8 @@ public class MonitoredInputStream extends FilterInputStream { public int read(byte[] b) throws IOException { int v=in.read(b); if(v!=-1) { - for(AtomicLong x:total) - x.addAndGet(v); + for(LongAdder x:total) + x.add(v); } return v; } @@ -37,8 +38,8 @@ public class MonitoredInputStream extends FilterInputStream { public int read(byte[] b, int off, int len) throws IOException { int v=in.read(b, off, len); if(v!=-1) { - for(AtomicLong x:total) - x.addAndGet(v); + for(LongAdder x:total) + x.add(v); } return v; } diff --git a/src/org/kne/cloud/network/klalb/MonitoredOutputStream.java b/src/org/kne/cloud/network/klalb/MonitoredOutputStream.java index 49d4a39..237a964 100644 --- a/src/org/kne/cloud/network/klalb/MonitoredOutputStream.java +++ b/src/org/kne/cloud/network/klalb/MonitoredOutputStream.java @@ -4,11 +4,12 @@ import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; public class MonitoredOutputStream extends FilterOutputStream { - private AtomicLong[] total; - public MonitoredOutputStream(OutputStream outputStream,AtomicLong ...v) { + private LongAdder[] total; + public MonitoredOutputStream(OutputStream outputStream,LongAdder ...v) { super(outputStream); this.total=v; } @@ -16,22 +17,22 @@ public class MonitoredOutputStream extends FilterOutputStream { @Override public void write(int b) throws IOException { out.write(b); - for(AtomicLong x:total) - x.incrementAndGet(); + for(LongAdder x:total) + x.add(1); } @Override public void write(byte[] b) throws IOException { out.write(b); - for(AtomicLong x:total) - x.addAndGet(b.length); + for(LongAdder x:total) + x.add(b.length); } @Override public void write(byte[] b, int off, int len) throws IOException { out.write(b, off, len); - for(AtomicLong x:total) - x.addAndGet(len); + for(LongAdder x:total) + x.add(len); } @Override diff --git a/src/org/kne/cloud/network/klalb/NACKTPacket.java b/src/org/kne/cloud/network/klalb/NACKTPacket.java index 73f2698..a4ec5b6 100644 --- a/src/org/kne/cloud/network/klalb/NACKTPacket.java +++ b/src/org/kne/cloud/network/klalb/NACKTPacket.java @@ -25,14 +25,14 @@ public class NACKTPacket extends KLALBPacket implements PortPacket{ @Override public String toString() { - return "NACKT "+getSport()+"->"+getDport()+" "+getNumber()+"[]"; + return "NACKT "+getSrcPort()+"->"+getDstPort()+" "+getNumber()+"[]"; } - public int getSport() { + public int getSrcPort() { return klalbHeader.getInt(1); } - public int getDport() { + public int getDstPort() { return klalbHeader.getInt(5); } diff --git a/src/org/kne/cloud/network/klalb/PONGPacket.java b/src/org/kne/cloud/network/klalb/PONGPacket.java index 1c33a8c..01c5ba3 100644 --- a/src/org/kne/cloud/network/klalb/PONGPacket.java +++ b/src/org/kne/cloud/network/klalb/PONGPacket.java @@ -27,7 +27,7 @@ public class PONGPacket extends KLALBPacket { @Override - public long getLength() { + public long getTotalLength() { return HEADER_LENGTH; } diff --git a/src/org/kne/cloud/network/klalb/KLALBPacketConsumer.java b/src/org/kne/cloud/network/klalb/PacketConsumer.java similarity index 50% rename from src/org/kne/cloud/network/klalb/KLALBPacketConsumer.java rename to src/org/kne/cloud/network/klalb/PacketConsumer.java index 592890c..0c2bb07 100644 --- a/src/org/kne/cloud/network/klalb/KLALBPacketConsumer.java +++ b/src/org/kne/cloud/network/klalb/PacketConsumer.java @@ -4,6 +4,8 @@ import java.net.Inet6Address; import java.util.function.BiConsumer; import java.util.function.Consumer; -public interface KLALBPacketConsumer extends BiConsumer { +import org.kne.cloud.network.NetworkPacket; -} +public interface PacketConsumer extends BiConsumer { + +} diff --git a/src/org/kne/cloud/network/klalb/PortBinder.java b/src/org/kne/cloud/network/klalb/PortBinder.java index faf7d20..31ecc6b 100644 --- a/src/org/kne/cloud/network/klalb/PortBinder.java +++ b/src/org/kne/cloud/network/klalb/PortBinder.java @@ -18,6 +18,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.kne.cloud.network.NetworkPacket; + import com.google.gson.internal.Pair; public class PortBinder { @@ -58,7 +60,7 @@ public class PortBinder { if(portn==portnod) { cnt++; if(cnt>1) { - throw new BindException("can't alloc port"); + throw new BindException("can't alloc port"); } } boolean flag=true; @@ -105,7 +107,7 @@ public class PortBinder { connectMaplock.writeLock().unlock(); } } - public void disconnect(BindableKLALBPacketConsumer ks) throws BindException { + public void disconnect(BindableKLALBPacketConsumer ks) { connectMaplock.writeLock().lock(); try { removeAsValue(connectMap, ks); @@ -122,7 +124,7 @@ public class PortBinder { listenMaplock.writeLock().unlock(); } } - public void unlisten(BindableKLALBPacketConsumer ks) throws BindException { + public void unlisten(BindableKLALBPacketConsumer ks) { /*System.out.println(listenMap); new RuntimeException("!").printStackTrace();*/ listenMaplock.writeLock().lock(); @@ -205,35 +207,35 @@ public class PortBinder { return b; }*/ public boolean distributePacketToConsumer(Inet6Address srcAddr,PortPacket packet) { - InetSocketAddress local=new InetSocketAddress(controller.getSelf().getAddress(), packet.getDport()); - InetSocketAddress remote=new InetSocketAddress(srcAddr, packet.getSport()); + InetSocketAddress local=new InetSocketAddress(controller.getSelf().getAddress(), packet.getDstPort()); + InetSocketAddress remote=new InetSocketAddress(srcAddr, packet.getSrcPort()); BindableKLALBPacketConsumer bkc=connectMap.get(new Pair(local, remote)); if(bkc!=null) { - bkc.accept(srcAddr, (KLALBPacket) packet); + bkc.accept(srcAddr, (NetworkPacket) packet); return true; } - InetSocketAddress localany=new InetSocketAddress(ANYLA, packet.getDport()); + InetSocketAddress localany=new InetSocketAddress(ANYLA, packet.getDstPort()); bkc=connectMap.get(new Pair(localany, remote)); if(bkc!=null) { - bkc.accept(srcAddr, (KLALBPacket) packet); + bkc.accept(srcAddr, (NetworkPacket) packet); return true; } bkc=listenMap.get(local); if(bkc!=null) { - bkc.accept(srcAddr, (KLALBPacket) packet); + bkc.accept(srcAddr, (NetworkPacket) packet); return true; } bkc=listenMap.get(localany); if(bkc!=null) { - bkc.accept(srcAddr, (KLALBPacket) packet); + bkc.accept(srcAddr, (NetworkPacket) packet); return true; } return false; } - public boolean checkIsBind(KLALBVirtualSocketImpl klalbVirtualSocketImpl) { + public boolean checkIsBind(BindableKLALBPacketConsumer klalbVirtualSocketImpl) { return bindMap.containsValue(klalbVirtualSocketImpl); } public boolean checkIsConnect(BindableKLALBPacketConsumer kservers,InetSocketAddress isaf) throws BindException { diff --git a/src/org/kne/cloud/network/klalb/PortPacket.java b/src/org/kne/cloud/network/klalb/PortPacket.java index aaf6e9d..1757557 100644 --- a/src/org/kne/cloud/network/klalb/PortPacket.java +++ b/src/org/kne/cloud/network/klalb/PortPacket.java @@ -2,7 +2,7 @@ package org.kne.cloud.network.klalb; public interface PortPacket { - public int getSport(); + public int getSrcPort(); - public int getDport(); + public int getDstPort(); } diff --git a/src/org/kne/cloud/network/klalb/RSTPacket.java b/src/org/kne/cloud/network/klalb/RSTPacket.java index 318b0c6..77180c4 100644 --- a/src/org/kne/cloud/network/klalb/RSTPacket.java +++ b/src/org/kne/cloud/network/klalb/RSTPacket.java @@ -20,17 +20,17 @@ public class RSTPacket extends KLALBPacket implements PortPacket{ } - public int getSport() { + public int getSrcPort() { return klalbHeader.getInt(1); } - public int getDport() { + public int getDstPort() { return klalbHeader.getInt(5); } @Override public String toString() { - return "RST "+getSport()+"->"+getDport(); + return "RST "+getSrcPort()+"->"+getDstPort(); } diff --git a/src/org/kne/cloud/network/klalb/SendItem.java b/src/org/kne/cloud/network/klalb/SendItem.java index 7bea99c..5930fe2 100644 --- a/src/org/kne/cloud/network/klalb/SendItem.java +++ b/src/org/kne/cloud/network/klalb/SendItem.java @@ -1,22 +1,29 @@ package org.kne.cloud.network.klalb; +import org.kne.cloud.network.NetworkPacket; import org.kne.cloud.network.ipv6.IPv6Packet; -public class SendItem { +public class SendItem { - private IPv6Packet packet; + private long packetLength; + private T packet; private long sendtime=System.nanoTime(); - public SendItem(IPv6Packet packet) { + public SendItem(T packet) { this.packet=packet; + this.packetLength=packet.getTotalLength(); } - public IPv6Packet getPacket() { + public T getPacket() { return packet; } public long getSendtime() { return sendtime; } + + public long getPacketLength() { + return packetLength; + } } diff --git a/src/org/kne/cloud/network/klalb/SimpleKLALBClient.java b/src/org/kne/cloud/network/klalb/SimpleKLALBClient.java deleted file mode 100644 index a008113..0000000 --- a/src/org/kne/cloud/network/klalb/SimpleKLALBClient.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.kne.cloud.network.klalb; - -import java.io.File; -import java.io.IOException; -import java.net.Inet6Address; -import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.net.UnknownHostException; -import java.util.Iterator; -import java.util.List; -import java.util.Properties; -import java.util.Scanner; - -import org.kne.cloud.network.MultipurposeSocketAddress; -import org.kne.cloud.network.SocketBridge; -import org.kne.cloud.network.SocketListener; -import org.kne.cloud.network.SocketToSocketProxy; -import org.kne.cloud.network.klalb.ui.KLALBStateGUI2; -import org.kne.util.AutoProperties; - -public class SimpleKLALBClient { - public static KLALBStateGUI2 ksg; -public static void main(String[] args) throws UnknownHostException, IOException { - - System.out.println(CONST.klalb+" V"+CONST.klalbver); - Scanner scn=new Scanner(System.in); - Properties def=new Properties(); - def.setProperty("server", ""); - def.setProperty("local", ""); - AutoProperties ap=new AutoProperties(new File("klalbclient.ini"),def); - KLALBController kc=new KLALBController(); - kc.registerToProxyTypeAs("KLALB"); - MultipurposeSocketAddress msa=new MultipurposeSocketAddress(ap.getProperty("server")); - Inet6Address vad= kc.getRemoteVaddrBySocketAddress(msa); - MultipurposeSocketAddress vmsa=new MultipurposeSocketAddress("KLALB_Stream",new InetSocketAddress(vad, 23333)); - System.out.println("连接成功:"+ap.getProperty("server")); - new SocketToSocketProxy(new MultipurposeSocketAddress(ap.getProperty("local")), vmsa); - //System.out.println("提示:输入state并回车可以查看当前线路状态"); - while(true) { - String s=scn.nextLine(); - switch(s) { - case "help": - System.out.println("help:查看命令使用说明"); - System.out.println("state:查看线路状态"); - //System.out.println("reload:重新加载线路配置文件"); - System.out.println("reconnect:所有离线线路跳过重连等待时间立即尝试重连"); - System.out.println("monitor:显示监视器图形界面"); - System.out.println("stop:退出程序"); - break; - case "stop": - System.exit(0); - break; - case "state": - System.out.println("状态\t可靠性\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动"); - synchronized (kc.getLines()) { - for (Iterator iterator = kc.getLines().iterator(); iterator.hasNext();) { - KLALBRemoteLine hostPort = iterator.next(); - System.out.println(hostPort .toString()); - //System.out.println(); - } - } - break; - case "monitor": - if(ksg==null) - ksg=new KLALBStateGUI2(kc); - ksg.setVisible(true); - break; - case "reconnect": - kc.reconnectImmediately(); - break; - default : - System.out.println("未知命令,请输入help以查询命令说明"); - - } - } -} -} diff --git a/src/org/kne/cloud/network/klalb/SimpleKLALBServer.java b/src/org/kne/cloud/network/klalb/SimpleKLALBServer.java deleted file mode 100644 index cbe142f..0000000 --- a/src/org/kne/cloud/network/klalb/SimpleKLALBServer.java +++ /dev/null @@ -1,181 +0,0 @@ -package org.kne.cloud.network.klalb; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Iterator; -import java.util.Scanner; - -import org.kne.cloud.network.DatagramSocketListener; -import org.kne.cloud.network.MultipurposeSocketAddress; -import org.kne.cloud.network.ProtocolDetectorServerSocketFactory; -import org.kne.cloud.network.ProtocolDetectorSocket; -import org.kne.cloud.network.SocketBridge; -import org.kne.cloud.network.SocketListener; -import org.kne.cloud.network.SocketToSocketProxy; -import org.kne.cloud.network.SocketType; -import org.kne.cloud.network.klalb.ui.KLALBStateGUI2; - -public class SimpleKLALBServer { - public static KLALBStateGUI2 ksg; - public static SocketListener tcpl; - public static DatagramSocketListener udpl; - public static ServerPropties sp; - public static KLALBController kc; - static { - MultipurposeSocketAddress.getSocketTypeRegister().put("DETTCP",new SocketType(null, new ProtocolDetectorServerSocketFactory())); - } - public static void main(String[] args) throws IOException { - //Debuger dbg=new Debuger(); - //dbg.start(); - - System.out.println(CONST.klalb+" V"+CONST.klalbver); - sp=new ServerPropties(); - - System.out.println("虚拟地址:"+sp.getVirtualIP().getHostAddress()); - kc=new KLALBController(sp.getVirtualIP()); - /* kc.setSelflineTableSupplier(()->{ - return fileRead("linetable.txt"); - });*/ - kc.registerToProxyTypeAs("KLALB"); - - System.out.println("开放端口:"+sp.getBind()); - openPort(sp.getBind()); - System.out.println("本地服务:"+sp.getLocal()); - openLocalPort(sp.getLocal()); - - - - Scanner scn=new Scanner(System.in); - while(true) { - String s=scn.next(); - String[]sc=s.split(" "); - switch(sc[0]) { - case "help": - System.out.println("state:查看线路状态"); - System.out.println("reload:重新加载线路配置"); - System.out.println("monitor:显示监视器图形界面"); - System.out.println("stop:退出程序"); - break; - case "stop": - System.exit(0); - break; - case "state": - System.out.println("状态\t可靠性\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动"); - synchronized (kc.getLines()) { - for (Iterator iterator = kc.getLines().iterator(); iterator.hasNext();) { - KLALBRemoteLine hostPort = iterator.next(); - System.out.println(hostPort .toString()); - //System.out.println(); - } - } - break; - case "monitor": - if(ksg==null) - ksg=new KLALBStateGUI2(kc); - ksg.setVisible(true); - break; - default: - System.out.println("未知命令,请输入help以查询指令说明"); - } - } - } - private static void openPort(String bip) throws IOException { - if(tcpl!=null) - tcpl.close(); - if(udpl!=null) { - udpl.close(); - } - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(bip,"DETTCP"); - tcpl=new SocketListener(mpsa); - tcpl.setCon((soc)->{ - ProtocolDetectorSocket pds=(ProtocolDetectorSocket) soc; - if(!pds.getProtocolStack().isEmpty()&&pds.getProtocolStack().pop().getName().equals("KLALB")) { - KLALBRemoteLine krs=null; - try { - krs = new KLALBRemoteLine(new StreamKLALBPacketLink(pds)); - kc.addRemoteLine(krs); - } catch (IOException e) { - e.printStackTrace(); - } - }else { - MultipurposeSocketAddress mpsa2=new MultipurposeSocketAddress(sp.getLocal()); - Socket s=null; - try { - s=mpsa2.connectSocket(); - new SocketBridge(pds, s).run(); - } catch (UnknownHostException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } catch (IOException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - }finally { - if(s!=null) - try { - s.close(); - } catch (IOException e1) { - // TODO 自动生成的 catch 块 - e1.printStackTrace(); - } - try { - soc.close(); - } catch (IOException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } - } - } - }); - udpl=new DatagramSocketListener(new MultipurposeSocketAddress(bip, "UDP")); - udpl.setCon((r)->{ - KLALBRemoteLine krl; - try { - krl=new KLALBRemoteLine(new SplitedDatagramKLALBPacketLink(r)); - kc.addRemoteLine(krl); - } catch (IOException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } - }); - } - private static void openLocalPort(String bip) throws IOException { - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(bip); - new SocketToSocketProxy(new MultipurposeSocketAddress("KLALB_Stream", "::0", 23333),mpsa); - } - private static String fileRead(String filePath){ - //1.定义一个BufferedReader对象,将文件内容读取到缓存 - BufferedReader bufferedReader =null; - String returnInfo=""; - try{ - // 2.定义一个file对象 - File file = new File(filePath);//定义一个file对象,用来初始化FileReader - // 3.定义一个fileReader对象 - FileReader reader = new FileReader(file); - // 4.定义一个BufferedReader对象,将文件内容读取到缓存 - bufferedReader = new BufferedReader(reader); - // 5.定义一个字符串缓存,将字符串存放缓存中 - StringBuilder stringBuilder = new StringBuilder(); - String str = ""; - while ((str =bufferedReader.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格 - stringBuilder.append(str + "\n");//将读取的字符串添加换行符后累加存放在缓存中 - } - returnInfo = stringBuilder.toString(); - }catch (Exception e){ - e.printStackTrace(); - }finally { - try{ - if(bufferedReader!=null){ - bufferedReader.close(); - } - }catch (Exception e){ - e.printStackTrace(); - } - } - return returnInfo; - } - -} diff --git a/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java b/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java index 138e5d7..f724267 100644 --- a/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java +++ b/src/org/kne/cloud/network/klalb/StreamChannelKLALBPacketLink.java @@ -5,6 +5,7 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; +import java.io.StreamCorruptedException; import java.net.InetSocketAddress; import java.net.ProtocolFamily; import java.net.Socket; @@ -17,11 +18,17 @@ import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.Channels; +import java.nio.channels.GatheringByteChannel; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.ScatteringByteChannel; import java.nio.channels.SocketChannel; +import java.nio.channels.WritableByteChannel; +import java.util.List; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicLong; +import org.kne.cloud.network.BufferedChannel; import org.kne.cloud.network.ByteBufferAllocator; import org.kne.cloud.network.MultipurposeSocketAddress; import org.kne.cloud.network.NetworkPacket; @@ -32,6 +39,7 @@ import org.kne.io.KNEChannels; public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implements KLALBPacketLink { private volatile long timeoutTimer; private volatile boolean timerenabled=false; + private boolean enableBuffer=true; private Runnable timeouter=new Runnable() { public void run() { timeoutTimer=System.nanoTime(); @@ -61,13 +69,34 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem } private SocketChannel connectSocket; + private ScatteringByteChannel readableChannel; + private GatheringByteChannel writableChannel; private int sotimeout=getDefaultSoTimeout(); public StreamChannelKLALBPacketLink(SocketChannel connectSocket) throws IOException { + this(connectSocket,true); + } + public StreamChannelKLALBPacketLink(SocketChannel connectSocket,boolean enableBuffer) throws IOException { + try { this.connectSocket=connectSocket; + if(enableBuffer) { + BufferedChannel buf=new BufferedChannel(connectSocket,connectSocket,256*1024); + this.readableChannel =buf; + this.writableChannel =buf; + }else { + this.readableChannel=connectSocket; + this.writableChannel=connectSocket; + } + this.enableBuffer=enableBuffer; connectSocket.setOption(StandardSocketOptions.TCP_NODELAY,true); ThreadTool.makeVDaemonThread("连接超时计时线程", timeouter); - new KLALBOutputStream(Channels.newOutputStream(connectSocket)); - new KLALBInputStream(Channels.newInputStream(connectSocket)); + new KLALBOutputStream(Channels.newOutputStream(writableChannel)); + if(writableChannel instanceof BufferedChannel) + ((BufferedChannel) writableChannel).flush(); + new KLALBInputStream(Channels.newInputStream(readableChannel)); + }catch(Throwable e) { + connectSocket.close(); + throw e; + } } @@ -115,28 +144,9 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem szeWrite.putInt(kp.limit()); szeWrite.flip(); KLALBVirtualSocketChannel obj = null; - connectSocket.write(new ByteBuffer[] {szeWrite,kp}); - /* - if(connectSocket instanceof KLALBVirtualSocketChannel) { - obj=(KLALBVirtualSocketChannel) connectSocket; - } - boolean isaflush=false; - if(obj!=null) { - isaflush=obj.isAutoFlush(); - obj.setAutoFlush(false); - } - - //connectSocket.setOption(StandardSocketOptions.TCP_NODELAY,false); - connectSocket.write(szeWrite); - - //connectSocket.setOption(StandardSocketOptions.TCP_NODELAY,true); - if(obj!=null) { - obj.setAutoFlush(true); - } - connectSocket.write(kp); - if(obj!=null) { - obj.setAutoFlush(isaflush); - }*/ + writableChannel.write(new ByteBuffer[] {szeWrite,kp}); + checkflush(); + } @@ -161,7 +171,7 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem bbfw[i<<1]=szeWrite; bbfw[(i<<1)+1]=kpp[off+i]; } - connectSocket.write(bbfw); + writableChannel.write(bbfw); }else { for(int i=0;i pkts) throws IOException { + KLALBVirtualSocketChannel obj = null; + if(writableChannel instanceof KLALBVirtualSocketChannel) { + obj=(KLALBVirtualSocketChannel) writableChannel; + } + boolean isaflush=false; + if(obj!=null) { + isaflush=obj.isAutoFlush(); + obj.setAutoFlush(false); + } + ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4); + szeWrite.limit(4); + for(KLALBPacket kp:pkts) { + szeWrite.clear(); + int length=(int) kp.getTotalLength(); + incOutput(length); + szeWrite.putInt(length); + szeWrite.flip(); + + + writableChannel.write(szeWrite); + KLALBPacket.writeKLALBPacketToChannel(writableChannel, kp); + + } + if(obj!=null) { + obj.flush(); + } - - -/* @Override + checkflush(); + if(obj!=null) { + obj.setAutoFlush(isaflush); + } + } + + + @Override public void writeKLALBPacket(KLALBPacket kp) throws IOException { + ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4); szeWrite.limit(4); //szeWrite.clear(); - int length=(int) kp.getLength(); + int length=(int) kp.getTotalLength(); incOutput(length); szeWrite.putInt(length); szeWrite.flip(); KLALBVirtualSocketChannel obj = null; - if(connectSocket instanceof KLALBVirtualSocketChannel) { - obj=(KLALBVirtualSocketChannel) connectSocket; + if(writableChannel instanceof KLALBVirtualSocketChannel) { + obj=(KLALBVirtualSocketChannel) writableChannel; } boolean isaflush=false; if(obj!=null) { @@ -224,30 +270,47 @@ public class StreamChannelKLALBPacketLink extends AbstractKLALBPacketLink implem obj.setAutoFlush(false); } - connectSocket.write(szeWrite); + writableChannel.write(szeWrite); + + KLALBPacket.writeKLALBPacketToChannel(writableChannel, kp); if(obj!=null) { - obj.setAutoFlush(true); + obj.flush(); } - KLALBPacket.writeKLALBPacketToChannel(connectSocket, kp); + checkflush(); + /*AtomicLong al=new AtomicLong(0); + KLALBPacket.writeKLALBPacketToChannel(new MonitoredChannel(connectSocket,null,new AtomicLong[] { al}), kp); + if(length!=al.get()) { + throw new StreamCorruptedException(kp+" packet length error:"+al.get()+"!="+length); + }*/ if(obj!=null) { obj.setAutoFlush(isaflush); } } - - + private void checkflush() throws IOException { + if(writableChannel instanceof BufferedChannel) { + ((BufferedChannel) writableChannel).flush(); + } + } @Override public KLALBPacket readKLALBPacket() throws IOException { + ByteBuffer szeWrite=NetworkPacket.bufferAllocator.allocate(4); szeWrite.limit(4); - KNEChannels.readFully(connectSocket, szeWrite); + KNEChannels.readFully(readableChannel, szeWrite); szeWrite.flip(); int readSize=szeWrite.getInt(); incInput(readSize); - return KLALBPacket.readKLALBPacketFromChannel(connectSocket); - }*/ + KLALBPacket kp=KLALBPacket.readKLALBPacketFromChannel(readableChannel); + /* + long kpl=kp.getLength(); + if(kpl!=readSize) { + throw new StreamCorruptedException(kp+" packet length error:"+kpl+"!="+readSize); + }*/ + return kp; + } diff --git a/src/org/kne/cloud/network/klalb/ui/ClosableTabbedPane.java b/src/org/kne/cloud/network/klalb/ui/ClosableTabbedPane.java new file mode 100644 index 0000000..ad694f4 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/ClosableTabbedPane.java @@ -0,0 +1,27 @@ +package org.kne.cloud.network.klalb.ui; + +import java.awt.Component; + +import javax.swing.Icon; +import javax.swing.JTabbedPane; + +public class ClosableTabbedPane extends JTabbedPane { + public ClosableTabbedPane() { + super(); + // TODO 自动生成的构造函数存根 + } + + public ClosableTabbedPane(int tabPlacement, int tabLayoutPolicy) { + super(tabPlacement, tabLayoutPolicy); + // TODO 自动生成的构造函数存根 + } + + public ClosableTabbedPane(int tabPlacement) { + super(tabPlacement); + // TODO 自动生成的构造函数存根 + } + + public void addTab(String title,Icon icon,Component comp,String tip,boolean closable) { + UIUtils.addTab(this, title, icon,comp, tip,closable); + } +} diff --git a/src/org/kne/cloud/network/klalb/ui/Dials.java b/src/org/kne/cloud/network/klalb/ui/Dials.java new file mode 100644 index 0000000..7695251 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/Dials.java @@ -0,0 +1,7 @@ +package org.kne.cloud.network.klalb.ui; + +import org.jfree.chart.ChartPanel; + +public class Dials { + +} diff --git a/src/org/kne/cloud/network/klalb/ui/DoubleBandwidthLabel.java b/src/org/kne/cloud/network/klalb/ui/DoubleBandwidthLabel.java new file mode 100644 index 0000000..db8f62e --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/DoubleBandwidthLabel.java @@ -0,0 +1,54 @@ +package org.kne.cloud.network.klalb.ui; + +import javax.swing.JPanel; +import java.awt.GridLayout; +import javax.swing.JLabel; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import javax.swing.SwingConstants; + +import org.kne.cloud.network.klalb.KLALBUtils; + +public class DoubleBandwidthLabel extends JPanel { + private JLabel lblNewLabel_1; + private JLabel lblNewLabel; + /*public DoubleBandwidthLabel() { + setLayout(new GridLayout(2, 1, 0, 0)); + setPreferredSize(new Dimension(120, 60)); + + lblNewLabel_1 = new JLabel(KLALBUtils.defaultUnit(0)+"MB/s"); + lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER); + lblNewLabel_1.setFont(new Font("微软雅黑", Font.PLAIN, 24)); + add(lblNewLabel_1); + + lblNewLabel = new JLabel(KLALBUtils.defaultUnit(0*8)+"Mbps"); + lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER); + lblNewLabel.setFont(new Font("微软雅黑", Font.PLAIN, 24)); + add(lblNewLabel); + }*/ + public DoubleBandwidthLabel(String string) { + setLayout(new GridLayout(2, 1, 0, 0)); + setPreferredSize(new Dimension(140, 60)); + + lblNewLabel_1 = new JLabel(string+"B/s"); + lblNewLabel_1.setHorizontalAlignment(SwingConstants.CENTER); + lblNewLabel_1.setFont(new Font("微软雅黑", Font.PLAIN, 24)); + add(lblNewLabel_1); + + lblNewLabel = new JLabel(string+"bps"); + lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER); + lblNewLabel.setFont(new Font("微软雅黑", Font.PLAIN, 24)); + add(lblNewLabel); + } + public void setLabelForeground(Color color) { + lblNewLabel_1.setForeground(color); + lblNewLabel.setForeground(color); + } + + public void setBandwidth(long bandwidth) { + lblNewLabel_1.setText(KLALBUtils.convertIUintDefalut(bandwidth)+"B/s"); + lblNewLabel.setText(KLALBUtils.convertUintDefalut(bandwidth*8L)+"bps"); + } +} diff --git a/src/org/kne/cloud/network/klalb/ui/GraphPanel.java b/src/org/kne/cloud/network/klalb/ui/GraphPanel.java index 3f5cab7..abee8a0 100644 --- a/src/org/kne/cloud/network/klalb/ui/GraphPanel.java +++ b/src/org/kne/cloud/network/klalb/ui/GraphPanel.java @@ -6,6 +6,9 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; +import java.awt.LayoutManager; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; import java.awt.geom.GeneralPath; import java.io.IOException; import java.net.Inet6Address; @@ -24,6 +27,89 @@ import org.kne.cloud.network.klalb.KLALBUtils; import org.kne.cloud.network.srv6.KLALBRoutingProtocol.LinkDirection; public class GraphPanel extends JPanel { + /** + * + */ + private static final long serialVersionUID = 1L; + public GraphPanel() { + super(); + initgp(); + } + + public GraphPanel(boolean isDoubleBuffered) { + super(isDoubleBuffered); + initgp(); + } + + public GraphPanel(LayoutManager layout, boolean isDoubleBuffered) { + super(layout, isDoubleBuffered); + initgp(); + } + + public GraphPanel(LayoutManager layout) { + super(layout); + initgp(); + } + + private void initgp() { + addMouseListener(new MouseListener() { + + @Override + public void mouseReleased(MouseEvent e) { + GraphNode node= getHitboxMatched(e); + if(node!=null) + node.runMouseReleased(e); + } + + @Override + public void mousePressed(MouseEvent e) { + GraphNode node= getHitboxMatched(e); + if(node!=null) + node.runMousePressed(e); + } + + @Override + public void mouseExited(MouseEvent e) { + GraphNode node= getHitboxMatched(e); + if(node!=null) + node.runMouseExited(e); + } + + @Override + public void mouseEntered(MouseEvent e) { + GraphNode node= getHitboxMatched(e); + if(node!=null) + node.runMouseEntered(e); + } + + @Override + public void mouseClicked(MouseEvent e) { + GraphNode node= getHitboxMatched(e); + if(node!=null) + node.runMouseClicked(e); + } + }); + + } + + + + + + private GraphNode getHitboxMatched(MouseEvent e) { + for (Iterator iterator = nodes.values().iterator(); iterator.hasNext();) { + GraphNode graphEdgeGroup = (GraphNode) iterator.next(); + if(graphEdgeGroup.checkPosHit(e.getX()/scale-translateX,e.getY()/scale-translateY)) { + return graphEdgeGroup; + } + } + return null; + } + + + + + private Map nodes=new ConcurrentHashMap(); private List edgeGroups=new ArrayList(); @@ -129,6 +215,40 @@ public class GraphPanel extends JPanel { this.ismarked=ismarked; } + private Listmouselisteners=new ArrayList(); + + public void addMouseListener(MouseListener listeners) { + mouselisteners.add(listeners); + } + + protected void runMouseClicked(MouseEvent e) { + mouselisteners.forEach((v)->{v.mouseClicked(e);}); + } + + protected void runMouseEntered(MouseEvent e) { + mouselisteners.forEach((v)->{v.mouseEntered(e);}); + } + + protected void runMouseExited(MouseEvent e) { + mouselisteners.forEach((v)->{v.mouseExited(e);}); + + } + + protected void runMousePressed(MouseEvent e) { + mouselisteners.forEach((v)->{v.mousePressed(e);}); + } + + protected void runMouseReleased(MouseEvent e) { + mouselisteners.forEach((v)->{v.mouseReleased(e);}); + + } + + public boolean checkPosHit(double x2, double y2) { + double dx=x2-x; + double dy=y2-y; + return Math.sqrt(dx*dx+dy*dy)<=nodesize/2; + } + public double getNodesize() { return nodesize; } @@ -199,15 +319,16 @@ public class GraphPanel extends JPanel { this.y = y; } + protected Image getCurrentImage() { + return ismarked?image2:image; + } + public void paint(Graphics2D g) { g.setColor(Color.BLACK); g.setStroke(new BasicStroke(2.0f)); if(image!=null) { - if(ismarked) { - g.drawImage(image2,(int)(x-image.getWidth(null)/2),(int)(y-image.getHeight(null)/2) ,null); - }else { - g.drawImage(image,(int)(x-image.getWidth(null)/2),(int)(y-image.getHeight(null)/2) ,null); - } + Image imgtmp=getCurrentImage(); + g.drawImage(imgtmp,(int)(x-image.getWidth(null)/2),(int)(y-image.getHeight(null)/2) ,null); }else { g.drawOval((int)(x-nodesize/2), (int)(y-nodesize/2), (int)(nodesize), (int)(nodesize)); if(ismarked) { diff --git a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI.java b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI.java index 295fe77..004adb0 100644 --- a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI.java +++ b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI.java @@ -21,6 +21,7 @@ import javax.imageio.ImageIO; import javax.swing.JPanel; import javax.swing.border.LineBorder; +import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.klalb.CONST; import org.kne.cloud.network.klalb.KLALBController; import org.kne.cloud.network.klalb.KLALBRemoteLine; @@ -146,8 +147,10 @@ public class KLALBStateGUI extends XFrame { @Override public void run() { synchronized (kc.getLines()) { - loop:for (Iterator iterator = kc.getLines().iterator(); iterator.hasNext();) { - KLALBRemoteLine ent = iterator.next(); + loop:for (Iterator iterator = kc.getLines().iterator(); iterator.hasNext();) { + IPv6NetworkLink link=iterator.next(); + if(link instanceof KLALBRemoteLine) { + KLALBRemoteLine ent = (KLALBRemoteLine)link ; Component[] count=ysp.getView().getComponents(); for (int i = 0; i < count.length; i++) { Component tp=count[i]; @@ -159,6 +162,7 @@ public class KLALBStateGUI extends XFrame { } TPanel tp=new TPanel(ent); ysp.getView().add(tp); + } } Component[] count=ysp.getView().getComponents(); for (int i = 0; i < count.length; i++) { diff --git a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI2.java b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI2.java index d077816..0eff1c9 100644 --- a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI2.java +++ b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI2.java @@ -795,7 +795,7 @@ public class KLALBStateGUI2 extends XFrame { panel_4.add(textFieldLocate, BorderLayout.CENTER); textFieldLocate.setColumns(10); - graph = new NetworkGraphPanel(kc.getIpv6Router().getKlalbRouteProtol()); + graph = new NetworkGraphPanel(kc); graph.setOpaque(false); JScrollPane jsp=new JScrollPane();jsp.setWheelScrollingEnabled(false); jsp.setViewportView(graph); @@ -1037,25 +1037,25 @@ textFieldLocate.addKeyListener(new KeyListener() { public void run() { double outload=kc.getLinkMonitor().getOutSpeed()*100.0/kc.getLinkMonitor().getOutSpeedMax2(); if(Double.isFinite(outload)) { - upSpeedText.setLabel(KLALBUtils.bytesUnit(kc.getLinkMonitor().getOutSpeedAvg())+"/s"); + upSpeedText.setLabel(KLALBUtils.convertIBUint(kc.getLinkMonitor().getOutSpeedAvg())+"/s"); upSpeed.setValue(Math.min(upSpeed.getValue().doubleValue()*0.98+outload*0.02,101.0)); } double inload=kc.getLinkMonitor().getInSpeed()*100.0/kc.getLinkMonitor().getInSpeedMax2(); if(Double.isFinite(inload)) { - downSpeedText.setLabel(KLALBUtils.bytesUnit(kc.getLinkMonitor().getInSpeedAvg())+"/s"); + downSpeedText.setLabel(KLALBUtils.convertIBUint(kc.getLinkMonitor().getInSpeedAvg())+"/s"); downSpeed.setValue(Math.min(downSpeed.getValue().doubleValue()*0.98+inload*0.02,101.0)); } double outPPSload=kc.getLinkMonitor().getOutPPS()*100.0/kc.getLinkMonitor().getOutPPSMax2(); if(Double.isFinite(outPPSload)) { - upPPSText.setLabel(KLALBUtils.defaultUnit(kc.getLinkMonitor().getOutPPSAvg())+"PPS"); + upPPSText.setLabel(KLALBUtils.convertIUintDefalut(kc.getLinkMonitor().getOutPPSAvg())+"PPS"); upPPS.setValue(Math.min(upPPS.getValue().doubleValue()*0.98+outPPSload*0.02,101.0)); } double inPPSload=kc.getLinkMonitor().getInPPS()*100.0/kc.getLinkMonitor().getInPPSMax2(); if(Double.isFinite(inPPSload)) { - downPPSText.setLabel(KLALBUtils.defaultUnit(kc.getLinkMonitor().getInPPSAvg())+"PPS"); + downPPSText.setLabel(KLALBUtils.convertIUintDefalut(kc.getLinkMonitor().getInPPSAvg())+"PPS"); downPPS.setValue(Math.min(downPPS.getValue().doubleValue()*0.98+inPPSload*0.02,101.0)); } @@ -1138,7 +1138,7 @@ textFieldLocate.addKeyListener(new KeyListener() { if(tsk4!=null) { tsk4.cancel(); } - tsk4=new TimerTask() { + /*tsk4=new TimerTask() { @Override public void run() { @@ -1155,7 +1155,7 @@ textFieldLocate.addKeyListener(new KeyListener() { } } }; - t3.scheduleAtFixedRate(tsk4, 200, 20); + t3.scheduleAtFixedRate(tsk4, 200, 20);*/ if(tsk5!=null) { tsk5.cancel(); } diff --git a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java index 70505ed..1692a9c 100644 --- a/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java +++ b/src/org/kne/cloud/network/klalb/ui/KLALBStateGUI3.java @@ -7,6 +7,7 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; +import java.awt.Image; import java.awt.MenuItem; import java.awt.Point; import java.awt.PopupMenu; @@ -29,6 +30,8 @@ import java.awt.event.MouseWheelListener; import java.io.IOException; import java.net.Inet6Address; import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; @@ -36,6 +39,9 @@ import java.util.Timer; import java.util.TimerTask; import java.util.function.Consumer; +import javax.imageio.ImageIO; +import javax.swing.Icon; +import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComboBox; @@ -63,11 +69,14 @@ import org.jfree.chart.plot.dial.StandardDialRange; import org.jfree.chart.plot.dial.StandardDialScale; import org.jfree.chart.ui.RectangleEdge; import org.jfree.data.general.DefaultValueDataset; +import org.kne.cloud.clock.HighAccuracyClock; import org.kne.cloud.klalb.uitool.ComboSettingItem; import org.kne.cloud.klalb.uitool.SettingItem; import org.kne.cloud.klalb.uitool.TextAreaSettingItem; import org.kne.cloud.klalb.uitool.TextSettingItem; +import org.kne.cloud.klalb.uitool.XDefaultListModel; import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.klalb.CONST; import org.kne.cloud.network.klalb.KLALBConfig; import org.kne.cloud.network.klalb.KLALBConfigItem; @@ -155,9 +164,17 @@ public class KLALBStateGUI3 extends XFrame { private JTextArea openLineTabelSet; private JTextArea connectLineTabelSet; + private Consumer saveComsumer; private JComboBox comboLang; + + private XDefaultListModel nilsimdl; + private JTextField textFieldTime; + + private JTextArea ntpServerSet; + + private ClosableTabbedPane tabbedPane; public Consumer getSaveComsumer() { @@ -191,12 +208,18 @@ public class KLALBStateGUI3 extends XFrame { * Color(0,0,0,80)); getTitlelabel().setForeground(Color.WHITE); */ - JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); + tabbedPane = new ClosableTabbedPane(JTabbedPane.TOP); getContentPane().add(tabbedPane, BorderLayout.CENTER); JPanel panel_3 = new JPanel(); panel_3.setBackground(new Color(255, 255, 255)); - tabbedPane.addTab(UIEnv.getRsb().getString("networkgraph"), null, panel_3, null); + Icon icon=null; + try { + icon=new ImageIcon(ImageIO.read(KLALBStateGUI3.class.getResourceAsStream("/assets/graph.png")).getScaledInstance(15, 15,Image.SCALE_SMOOTH )); + }catch(IOException e) { + e.printStackTrace(); + } + tabbedPane.addTab(UIEnv.getRsb().getString("networkgraph"), icon, panel_3, null,false); panel_3.setLayout(new BorderLayout(0, 0)); JPanel panel_4 = new JPanel(); @@ -207,7 +230,7 @@ public class KLALBStateGUI3 extends XFrame { panel_4.add(textFieldLocate, BorderLayout.CENTER); textFieldLocate.setColumns(10); - graph = new NetworkGraphPanel(kc.getIpv6Router().getKlalbRouteProtol()); + graph = new NetworkGraphPanel(kc,this); graph.setOpaque(false); JScrollPane jsp = new JScrollPane(); jsp.setWheelScrollingEnabled(false); @@ -356,13 +379,13 @@ public class KLALBStateGUI3 extends XFrame { dpup.addLayer(dp); upSpeedText = new DialTextAnnotation("0%"); - upSpeedText.setFont(UIEnv.getFont().deriveFont(18.0f)); + upSpeedText.setFont(UIEnv.getFont().deriveFont(20.0f)); dpup.addLayer(upSpeedText); JFreeChart jfup = new JFreeChart(dpup); jfup.setBorderPaint(Color.WHITE); jfup.setTitle(UIEnv.getRsb().getString("uploadspeed")); - jfup.getTitle().setFont(UIEnv.getFont().deriveFont(20.0f)); + jfup.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); jfup.getTitle().setPosition(RectangleEdge.BOTTOM); dpup.setView(0, 0, 1, 1); ChartPanel cpup = new ChartPanel(jfup); @@ -415,13 +438,13 @@ public class KLALBStateGUI3 extends XFrame { dpup1.addLayer(dp1); downSpeedText = new DialTextAnnotation("0%"); - downSpeedText.setFont(UIEnv.getFont().deriveFont(18.0f)); + downSpeedText.setFont(UIEnv.getFont().deriveFont(20.0f)); dpup1.addLayer(downSpeedText); JFreeChart jfup1 = new JFreeChart(dpup1); jfup1.setBorderPaint(Color.WHITE); jfup1.setTitle(UIEnv.getRsb().getString("downloadspeed")); - jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(20.0f)); + jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); jfup1.getTitle().setPosition(RectangleEdge.BOTTOM); dpup1.setView(0, 0, 1, 1); ChartPanel cpup1 = new ChartPanel(jfup1); @@ -477,13 +500,13 @@ public class KLALBStateGUI3 extends XFrame { dpup.addLayer(dp); upPPSText = new DialTextAnnotation("0PPS"); - upPPSText.setFont(UIEnv.getFont().deriveFont(18.0f)); + upPPSText.setFont(UIEnv.getFont().deriveFont(20.0f)); dpup.addLayer(upPPSText); JFreeChart jfup = new JFreeChart(dpup); jfup.setBorderPaint(Color.WHITE); jfup.setTitle(UIEnv.getRsb().getString("uploadpps")); - jfup.getTitle().setFont(UIEnv.getFont().deriveFont(20.0f)); + jfup.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); jfup.getTitle().setPosition(RectangleEdge.BOTTOM); dpup.setView(0, 0, 1, 1); ChartPanel cpup = new ChartPanel(jfup); @@ -535,13 +558,13 @@ public class KLALBStateGUI3 extends XFrame { dpup1.addLayer(dp11); downPPSText = new DialTextAnnotation("0PPS"); - downPPSText.setFont(UIEnv.getFont().deriveFont(18.0f)); + downPPSText.setFont(UIEnv.getFont().deriveFont(20.0f)); dpup1.addLayer(downPPSText); JFreeChart jfup1 = new JFreeChart(dpup1); jfup1.setBorderPaint(Color.WHITE); jfup1.setTitle(UIEnv.getRsb().getString("downloadpps")); - jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(20.0f)); + jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); jfup1.getTitle().setPosition(RectangleEdge.BOTTOM); dpup1.setView(0, 0, 1, 1); ChartPanel cpup1 = new ChartPanel(jfup1); @@ -557,7 +580,7 @@ public class KLALBStateGUI3 extends XFrame { panel.setOpaque(false); panel.setBorder(new LineBorder(Color.GRAY)); panel_4_1.add(panelp, BorderLayout.CENTER); - panelp.setLayout(new GridLayout(3, 1, 0, 0)); + panelp.setLayout(new GridLayout(4, 1, 0, 0)); JPanel panel_2x = new JPanel(); panel_2x.setOpaque(false); @@ -573,11 +596,11 @@ public class KLALBStateGUI3 extends XFrame { panel_2x_1.setLayout(new BorderLayout(0, 0)); JLabel lblNewLabel_1 = new JLabel(UIEnv.getRsb().getString("asnumber")); - lblNewLabel_1.setFont(new Font("微软雅黑", Font.PLAIN, 20)); + lblNewLabel_1.setFont(UIEnv.getFont().deriveFont(18.0f)); panel_2x_1.add(lblNewLabel_1, BorderLayout.WEST); asnField2 = new JTextField(); - asnField2.setFont(new Font("微软雅黑", Font.PLAIN, 20)); + asnField2.setFont(UIEnv.getFont().deriveFont(18.0f)); asnField2.setHorizontalAlignment(SwingConstants.CENTER); asnField2.setEditable(false); panel_2x_1.add(asnField2, BorderLayout.CENTER); @@ -594,7 +617,7 @@ public class KLALBStateGUI3 extends XFrame { panel_2x_1.add(btnNewButton_2, BorderLayout.EAST); JLabel lblNewLabel = new JLabel(UIEnv.getRsb().getString("ipv6addr")); - lblNewLabel.setFont(UIEnv.getFont().deriveFont(20.0f)); + lblNewLabel.setFont(UIEnv.getFont().deriveFont(18.0f)); lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER); panel_2x.add(lblNewLabel, BorderLayout.WEST); panel_2x.add(panel_2); @@ -606,7 +629,7 @@ public class KLALBStateGUI3 extends XFrame { addressField.setOpaque(false); panel_2.add(addressField); addressField.setColumns(10); - addressField.setFont(UIEnv.getFont().deriveFont(20.0f)); + addressField.setFont(UIEnv.getFont().deriveFont(18.0f)); JButton btnNewButton_1 = new JButton(UIEnv.getRsb().getString("copy")); btnNewButton_1.addActionListener(new ActionListener() { @@ -622,21 +645,45 @@ public class KLALBStateGUI3 extends XFrame { JLabel jlb = new JLabel(UIEnv.getRsb().getString("onlinedevices")); jlb.setHorizontalAlignment(SwingConstants.CENTER); - jlb.setFont(UIEnv.getFont().deriveFont(20.0f)); + jlb.setFont(UIEnv.getFont().deriveFont(18.0f)); panel.add(jlb, BorderLayout.WEST); devicesOnline = new JTextField(); devicesOnline.setOpaque(false); devicesOnline.setHorizontalAlignment(SwingConstants.CENTER); - devicesOnline.setFont(UIEnv.getFont().deriveFont(20.0f)); + devicesOnline.setFont(UIEnv.getFont().deriveFont(18.0f)); devicesOnline.setEditable(false); panel.add(devicesOnline); devicesOnline.setColumns(10); + + JPanel panel_5 = new JPanel(); + panel_5.setOpaque(false); + panel_5.setBorder(new LineBorder(Color.GRAY)); + panelp.add(panel_5); + panel_5.setLayout(new BorderLayout(0, 0)); + + JLabel jlb_1 = new JLabel(UIEnv.getRsb().getString("currenttime")); + jlb_1.setHorizontalAlignment(SwingConstants.CENTER); + jlb_1.setFont(jlb_1.getFont().deriveFont(18.0f)); + panel_5.add(jlb_1, BorderLayout.WEST); + + textFieldTime = new JTextField(); + textFieldTime.setOpaque(false); + textFieldTime.setHorizontalAlignment(SwingConstants.CENTER); + textFieldTime.setFont(textFieldTime.getFont().deriveFont(18.0f)); + textFieldTime.setEditable(false); + textFieldTime.setColumns(10); + panel_5.add(textFieldTime, BorderLayout.CENTER); JPanel linesPanel = new JPanel(); linesPanel.setOpaque(false); - tabbedPane.add(linesPanel); - tabbedPane.setTitleAt(1,UIEnv.getRsb().getString("remotelines")); + Icon icon2=null; + try { + icon2=new ImageIcon(ImageIO.read(KLALBStateGUI3.class.getResourceAsStream("/assets/ethnet.png")).getScaledInstance(15, 15,Image.SCALE_SMOOTH )); + }catch(IOException e) { + e.printStackTrace(); + } + tabbedPane.addTab (UIEnv.getRsb().getString("remotelines"), icon2, linesPanel,null,false); linesPanel.setLayout(new BorderLayout()); ysp = new YScrollPane(730); @@ -648,56 +695,11 @@ public class KLALBStateGUI3 extends XFrame { JMenu mnNewMenu = new JMenu(UIEnv.getRsb().getString("monitor")); menuBar.add(mnNewMenu); - /* - * JMenu mnNewMenu_1 = new JMenu("Update frequency"); - * mnNewMenu.add(mnNewMenu_1); ButtonGroup bg=new ButtonGroup(); - * JRadioButtonMenuItem rdbtnmntmNewRadioItem = new - * JRadioButtonMenuItem("0.5s"); mnNewMenu_1.add(rdbtnmntmNewRadioItem); - * bg.add(rdbtnmntmNewRadioItem); rdbtnmntmNewRadioItem.addActionListener(new - * ActionListener() { - * - * @Override public void actionPerformed(ActionEvent e) { rate=500; - * - * createRefreshTask(kc, ysp); } }); - * - * JRadioButtonMenuItem rdbtnmntmNewRadioItem_1 = new - * JRadioButtonMenuItem("0.2s"); mnNewMenu_1.add(rdbtnmntmNewRadioItem_1); - * bg.add(rdbtnmntmNewRadioItem_1); rdbtnmntmNewRadioItem_1.setSelected(true); - * rdbtnmntmNewRadioItem_1.addActionListener(new ActionListener() { - * - * - * @Override public void actionPerformed(ActionEvent e) { rate=200; - * - * createRefreshTask(kc, ysp); } }); - * - * JRadioButtonMenuItem rdbtnmntmNewRadioItem_2 = new - * JRadioButtonMenuItem("0.1s"); mnNewMenu_1.add(rdbtnmntmNewRadioItem_2); - * bg.add(rdbtnmntmNewRadioItem_2); - * - * rdbtnmntmNewRadioItem_2.addActionListener(new ActionListener() { - * - * @Override public void actionPerformed(ActionEvent e) { rate=100; - * - * createRefreshTask(kc, ysp); } }); - * - * JRadioButtonMenuItem rdbtnmntmNewRadioItem_21 = new - * JRadioButtonMenuItem("0.05s"); mnNewMenu_1.add(rdbtnmntmNewRadioItem_21); - * bg.add(rdbtnmntmNewRadioItem_21); - * rdbtnmntmNewRadioItem_21.addActionListener(new ActionListener() { - * - * @Override public void actionPerformed(ActionEvent e) { rate=50; - * - * createRefreshTask(kc, ysp); } }); - */ + showoffline = new JCheckBoxMenuItem(UIEnv.getRsb().getString("showofflines")); mnNewMenu.add(showoffline); - /* - * JProgressBar progressBar = new JProgressBar(); - * progressBar.setIndeterminate(true); progressBar.setForeground(Color.YELLOW); - * progressBar.setBorder(null); progressBar.setPreferredSize(new Dimension(100, - * 4)); ysp.add(progressBar, BorderLayout.NORTH); - */ + wv.addComponentListener(new ComponentListener() { @Override @@ -848,7 +850,13 @@ public class KLALBStateGUI3 extends XFrame { } }); yspc.add(btnSave, BorderLayout.SOUTH); - tabbedPane.addTab(UIEnv.getRsb().getString("settings"), null, configsPanel, null); + Icon icon3=null; + try { + icon3=new ImageIcon(ImageIO.read(KLALBStateGUI3.class.getResourceAsStream("/assets/settings.png")).getScaledInstance(15, 15,Image.SCALE_SMOOTH )); + }catch(IOException e) { + e.printStackTrace(); + } + tabbedPane.addTab (UIEnv.getRsb().getString("settings"), icon3, configsPanel,null,false); configsPanel.setOpaque(false); textField.addKeyListener(new KeyListener() { @@ -892,6 +900,7 @@ public class KLALBStateGUI3 extends XFrame { } catch (UnknownHostException e1) { e1.printStackTrace(); JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildipv6addr") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + return; } } String[]splt=dnsAreaSet.getText().split("\n"); @@ -907,6 +916,7 @@ public class KLALBStateGUI3 extends XFrame { if(show) { show=false; JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invailddnsserver") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + return; } } } @@ -921,6 +931,7 @@ public class KLALBStateGUI3 extends XFrame { }catch (NumberFormatException e) { e.printStackTrace(); JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildasnumber") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + return; } } @@ -933,6 +944,7 @@ public class KLALBStateGUI3 extends XFrame { }catch (RuntimeException e) { e.printStackTrace(); JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildtcplisten") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + return; } } @@ -945,6 +957,7 @@ public class KLALBStateGUI3 extends XFrame { }catch (RuntimeException e) { e.printStackTrace(); JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildudplisten") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + return; } } @@ -961,6 +974,7 @@ public class KLALBStateGUI3 extends XFrame { if(show1) { show1=false; JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildopenlinetable") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + return; } } } @@ -979,10 +993,36 @@ public class KLALBStateGUI3 extends XFrame { if(show11) { show11=false; JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildconnectlinetable") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + return; } } } kck.setConnectLineTable(iaddr11); + + String[]splt111=ntpServerSet.getText().split("\n"); + Listiaddr111=new ArrayList(); + boolean show111=true; + for (int i = 0; i < splt111.length; i++) { + try { + String str=splt111[i].trim(); + if(!str.isEmpty()) + iaddr111.add( new MultipurposeSocketAddress(str)); + } catch (RuntimeException e) { + e.printStackTrace(); + if(show111) { + show111=false; + JOptionPane.showMessageDialog(this,UIEnv.getRsb().getString("invaildntpservertable") , UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + return; + } + } + } + kck.setNtpServerTable(iaddr111); + + Listnie= new ArrayList<>(); + for(int i=0;i< nilsimdl.getSize();i++) { + nie.add(nilsimdl.getElementAt(i).getName()); + } + kck.setNetworkInterfaceExcepts(nie); } } if(saveComsumer!=null) { @@ -1000,7 +1040,7 @@ public class KLALBStateGUI3 extends XFrame { settings.getView().add(lang); settings.updateScrool(); - SettingItem si = new SettingItem(UIEnv.getRsb().getString("basicsettings"), UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), + SettingItem si = new SettingItem(UIEnv.getRsb().getString("virtualnetsettings"), UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), CONST.itemwidth, CONST.settingheight); settings.getView().add(si); @@ -1015,7 +1055,11 @@ public class KLALBStateGUI3 extends XFrame { TextSettingItem asn = new TextSettingItem(UIEnv.getRsb().getString("asnumber"), CONST.itemwidth, CONST.settingheight); asnFieldSet = asn.getTextField(); settings.getView().add(asn); - + + SettingItem six = new SettingItem(UIEnv.getRsb().getString("linksettings"), UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), + CONST.itemwidth, CONST.settingheight); + settings.getView().add(six); + TextSettingItem tcpl = new TextSettingItem(UIEnv.getRsb().getString("tcplistening"), CONST.itemwidth, CONST.settingheight); tcpListeningSet = tcpl.getTextField(); settings.getView().add(tcpl); @@ -1032,8 +1076,22 @@ public class KLALBStateGUI3 extends XFrame { TextAreaSettingItem clinet = new TextAreaSettingItem(UIEnv.getRsb().getString("autoconnectlinetable"), CONST.itemwidth, CONST.settingheight * 5); connectLineTabelSet = clinet.getTextArea(); - settings.getView().add(clinet); + settings.getView().add(clinet); + nilsimdl=new XDefaultListModel<>(); + NetworkInterfaceListSettingItem nilsi=new NetworkInterfaceListSettingItem(UIEnv.getRsb().getString("networkinterfaceexcept"), CONST.itemwidth, + CONST.settingheight * 5,nilsimdl); + settings.getView().add(nilsi); + + SettingItem hit = new SettingItem(UIEnv.getRsb().getString("timesyncsettings"), UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), + CONST.itemwidth, CONST.settingheight); + settings.getView().add(hit); + + TextAreaSettingItem ntps = new TextAreaSettingItem(UIEnv.getRsb().getString("ntpservers"), CONST.itemwidth, + CONST.settingheight * 5); + ntpServerSet = ntps.getTextArea(); + settings.getView().add(ntps); + SettingItem hi = new SettingItem(UIEnv.getRsb().getString("advancedsettings"), UIEnv.getFont().deriveFont(20.0f).deriveFont(Font.BOLD), CONST.itemwidth, CONST.settingheight); settings.getView().add(hi); @@ -1061,7 +1119,11 @@ public class KLALBStateGUI3 extends XFrame { kll = kc.getLines().toArray(); loop: for (int ix = 0; ix < kll.length; ix++) { - KLALBRemoteLine ent = (KLALBRemoteLine) kll[ix]; + IPv6NetworkLink link=(IPv6NetworkLink) kll[ix]; + if(!(link instanceof KLALBRemoteLine)) { + continue; + } + KLALBRemoteLine ent = (KLALBRemoteLine) link; /* * if(ent.getMonitor().getState()!=MonitorData.ONLINE) { continue loop; } */ @@ -1104,7 +1166,7 @@ public class KLALBStateGUI3 extends XFrame { // repaint(); } }; - t.scheduleAtFixedRate(tsk, 200, 500); + t.scheduleAtFixedRate(tsk, 500, 500); if (tsk2 != null) { tsk2.cancel(); } @@ -1112,27 +1174,29 @@ public class KLALBStateGUI3 extends XFrame { @Override public void run() { + + if (isVisible()) { double outload = kc.getLinkMonitor().getOutSpeed() * 100.0 / kc.getLinkMonitor().getOutSpeedMax2(); if (Double.isFinite(outload)) { - upSpeedText.setLabel(KLALBUtils.bytesUnit(kc.getLinkMonitor().getOutSpeedAvg()) + "/s"); + upSpeedText.setLabel(KLALBUtils.convertIBUint(kc.getLinkMonitor().getOutSpeedAvg()) + "/s"); upSpeed.setValue(Math.min(upSpeed.getValue().doubleValue() * 0.98 + outload * 0.02, 101.0)); } double inload = kc.getLinkMonitor().getInSpeed() * 100.0 / kc.getLinkMonitor().getInSpeedMax2(); if (Double.isFinite(inload)) { - downSpeedText.setLabel(KLALBUtils.bytesUnit(kc.getLinkMonitor().getInSpeedAvg()) + "/s"); + downSpeedText.setLabel(KLALBUtils.convertIBUint(kc.getLinkMonitor().getInSpeedAvg()) + "/s"); downSpeed.setValue(Math.min(downSpeed.getValue().doubleValue() * 0.98 + inload * 0.02, 101.0)); } double outPPSload = kc.getLinkMonitor().getOutPPS() * 100.0 / kc.getLinkMonitor().getOutPPSMax2(); if (Double.isFinite(outPPSload)) { - upPPSText.setLabel(KLALBUtils.defaultUnit(kc.getLinkMonitor().getOutPPSAvg()) + "PPS"); + upPPSText.setLabel(KLALBUtils.convertUintDefalut(kc.getLinkMonitor().getOutPPSAvg()) + "PPS"); upPPS.setValue(Math.min(upPPS.getValue().doubleValue() * 0.98 + outPPSload * 0.02, 101.0)); } double inPPSload = kc.getLinkMonitor().getInPPS() * 100.0 / kc.getLinkMonitor().getInPPSMax2(); if (Double.isFinite(inPPSload)) { - downPPSText.setLabel(KLALBUtils.defaultUnit(kc.getLinkMonitor().getInPPSAvg()) + "PPS"); + downPPSText.setLabel(KLALBUtils.convertUintDefalut(kc.getLinkMonitor().getInPPSAvg()) + "PPS"); downPPS.setValue(Math.min(downPPS.getValue().doubleValue() * 0.98 + inPPSload * 0.02, 101.0)); } @@ -1188,54 +1252,34 @@ public class KLALBStateGUI3 extends XFrame { if (!asnstr.equals(asnField2.getText())) { asnField2.setText(asnstr); } - - } + HighAccuracyClock hac=kc.getClock(); + long delta=hac.getFrequency()-1000000000; + double ppm=delta/1000.0; + String ppmstr=String.format("%.2f", ppm); + if(delta>0) { + ppmstr="+"+ppmstr; + } + textFieldTime.setText(hac.toString()+" "+ppmstr+"ppm"); + } + } }; - t2.scheduleAtFixedRate(tsk2, 200, 100); - - if (tsk3 != null) { + t2.scheduleAtFixedRate(tsk2, 100, 100); + + /*if(tsk3!=null) { tsk3.cancel(); } - tsk3 = new TimerTask() { - + tsk3=new TimerTask() { + @Override public void run() { - Component[] count = ysp.getView().getComponents(); - for (int i = 0; i < count.length; i++) { - Component tp = count[i]; - if (tp instanceof TPanel2) { - try { - ((TPanel2) tp).getMdg().updateTraffic(); - } catch (RuntimeException e) { - e.printStackTrace(); - } - } + + if (isVisible()) { } } }; - t3.scheduleAtFixedRate(tsk3, 200, 200); + t2.scheduleAtFixedRate(tsk3, 20, 20);*/ - if (tsk4 != null) { - tsk4.cancel(); - } - tsk4 = new TimerTask() { - - @Override - public void run() { - Component[] count = ysp.getView().getComponents(); - for (int i = 0; i < count.length; i++) { - Component tp = count[i]; - if (tp instanceof TPanel2) { - try { - ((TPanel2) tp).getMdg().recordData(); - } catch (RuntimeException e) { - e.printStackTrace(); - } - } - } - } - }; - t3.scheduleAtFixedRate(tsk4, 200, 20); + if (tsk5 != null) { tsk5.cancel(); } @@ -1243,17 +1287,17 @@ public class KLALBStateGUI3 extends XFrame { @Override public void run() { + if (isVisible()) { graph.loadNodes(); - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 100; i++) { graph.runPhy(); } - if (graph.isVisible()) { graph.repaint(); - graph.revalidate(); + graph.revalidate(); } } }; - t.scheduleAtFixedRate(tsk5, 200, 100); + t.scheduleAtFixedRate(tsk5, 1000, 1000); // setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @@ -1309,6 +1353,23 @@ public class KLALBStateGUI3 extends XFrame { List clinet =kck.getConnectLineTable(); String str2=listToStr2(clinet); connectLineTabelSet.setText(str2); + + List ntps =kck.getNtpServerTable(); + String str3=listToStr2(ntps); + ntpServerSet.setText(str3); + + List strexc=kck.getNetworkInterfaceExcepts(); + nilsimdl.clear(); + if(strexc!=null) { + for(String strexci:strexc) { + try { + nilsimdl.addElement(NetworkInterface.getByName(strexci)); + } catch (SocketException e) { + e.printStackTrace(); + } + } + } + } } } @@ -1333,6 +1394,11 @@ public class KLALBStateGUI3 extends XFrame { return sbdr.toString(); } + public void addNodeInformationPanel(NodeInformationPanel panel) { + tabbedPane.addTab(panel.getAddress().getHostAddress(), panel.getIcon(), panel, null, true); + // 选中最后一个Tab(即刚刚添加的) + tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); + } public void close() { setVisible(false); if (tsk != null) { diff --git a/src/org/kne/cloud/network/klalb/ui/KperfGUI.java b/src/org/kne/cloud/network/klalb/ui/KperfGUI.java new file mode 100644 index 0000000..f25ac62 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/KperfGUI.java @@ -0,0 +1,624 @@ +package org.kne.cloud.network.klalb.ui; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; + +import javax.swing.border.LineBorder; + +import org.jfree.chart.ChartPanel; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.plot.dial.DialPlot; +import org.jfree.chart.plot.dial.DialPointer; +import org.jfree.chart.plot.dial.DialTextAnnotation; +import org.jfree.chart.plot.dial.StandardDialFrame; +import org.jfree.chart.plot.dial.StandardDialRange; +import org.jfree.chart.plot.dial.StandardDialScale; +import org.jfree.chart.ui.RectangleEdge; +import org.jfree.data.general.DefaultValueDataset; +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.klalb.KLALBUtils; +import org.kne.cloud.network.monitor.QueueingMonitorDataImpl; +import org.kne.cloud.network.perf.Kperf; +import org.kne.cloud.network.perf.KperfReports; +import org.kne.ui.XFrame; +import javax.swing.JTabbedPane; +import java.awt.BorderLayout; +import javax.swing.JMenuBar; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.JButton; +import javax.swing.JMenu; +import java.awt.GridLayout; +import java.awt.Image; + +import javax.swing.JProgressBar; +import java.awt.event.ActionListener; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.io.IOException; +import java.util.Timer; +import java.util.TimerTask; +import java.awt.event.ActionEvent; +import javax.swing.JLabel; +import javax.imageio.ImageIO; +import javax.swing.BoxLayout; +import java.awt.Font; +import javax.swing.SwingConstants; +import javax.swing.ImageIcon; + +public class KperfGUI extends XFrame{ + private static Timer tmr=new Timer(); + + private KperfReports reports=new KperfReportsImpl(); + private Kperf kperf; + private JTextField targetAddressField; + private JButton startButton; + private JProgressBar progressBar; + private DefaultValueDataset upSpeed; + private DefaultValueDataset upDataSpeed; + private DialTextAnnotation upSpeedText; + private Dimension dashSize=new Dimension((int) (145 * 0.7), (int) (165 * 0.7)); + private DefaultValueDataset downSpeed; + private DefaultValueDataset downDataSpeed; + private DialTextAnnotation downSpeedText; + private JTextField sourceAddressField; + + private QueueingMonitorDataImpl monitor; + + private DefaultValueDataset upPPS; + + private DefaultValueDataset upDataPPS; + + private DialTextAnnotation upPPSText; + + private DefaultValueDataset downPPS; + + private DefaultValueDataset downDataPPS; + + private DialTextAnnotation downPPSText; + + private TimerTask tsk; + private class KperfReportsImpl implements KperfReports{ + @Override + public void testProcess(double process) { + progressBar.setValue((int) (process*100.0f)); + } + @Override + public void testFinish() { + if(kperf!=null) { + kperf.close(); + kperf=null; + } + updateButton(); + } + @Override + public void updateDial(QueueingMonitorDataImpl mdt) { + monitor=mdt; + } + @Override + public void uploadSpeedFinish(long uploadSpeed) { + upSpeedLabel.setBandwidth(uploadSpeed); + } + @Override + public void downloadSpeedFinish(long downloadSpeed) { + downSpeedLabel.setBandwidth(downloadSpeed); + } + @Override + public void uploadPPSFinish(long uploadPPS) { + upPPSLabel.setText(KLALBUtils.convertUintDefalut(uploadPPS)+"PPS"); + } + @Override + public void downloadPPSFinish(long downloadPPS) { + downPPSLabel.setText(KLALBUtils.convertUintDefalut(downloadPPS)+"PPS"); + + } + @Override + public void uploadDelayFinish(long uploadDelay) { + // TODO 自动生成的方法存根 + + } + @Override + public void downloadDelayFinish(long downloadDelay) { + // TODO 自动生成的方法存根 + + } + + + } + + public KperfGUI() { + this(null); + } + public KperfGUI(Component comp) { + // setResizable(false); + Image img=getIcon3(); + if(img!=null) + setIconImage(img); + // setTitleColor(new Color(255, 255, 255, 250)); + setTitleColor(UIEnv.getDefaultTitleColor()); + getContentPane().setBackground(UIEnv.getDefaultBackgroundColor()); + + JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout(0, 0)); + + targetAddressField = new JTextField(); + panel.add(targetAddressField); + targetAddressField.setColumns(10); + + startButton = new JButton(UIEnv.getRsb().getString("starttest")); + startButton.setForeground(Color.GREEN); + startButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(kperf==null) { + try { + String tar=targetAddressField.getText(); + MultipurposeSocketAddress msa=new MultipurposeSocketAddress(tar); + String sour=sourceAddressField.getText(); + MultipurposeSocketAddress msas=new MultipurposeSocketAddress(sour); + kperf=new Kperf(msa,msas); + kperf.setReports(reports); + kperf.startPerfing(); + }catch(RuntimeException ex) { + ex.printStackTrace(); + JOptionPane.showMessageDialog(KperfGUI.this,UIEnv.getRsb().getString("invaildinput") ,UIEnv.getRsb().getString("warning"), JOptionPane.WARNING_MESSAGE); + } + }else { + kperf.close(); + kperf=null; + } + updateButton(); + } + }); + panel.add(startButton, BorderLayout.EAST); + + JPanel panel_1 = new JPanel(); + panel_1.setOpaque(false); + getContentPane().add(panel_1, BorderLayout.CENTER); + panel_1.setLayout(new BorderLayout(0, 0)); + + JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); + panel_1.add(tabbedPane, BorderLayout.CENTER); + + JPanel panel_2 = new JPanel(); + panel_2.setOpaque(false); + tabbedPane.addTab(UIEnv.getRsb().getString("bandwidth"), null, panel_2, null); + panel_2.setLayout(new GridLayout(4, 1, 0, 0)); + + JPanel panel_3 = new JPanel(); + panel_2.add(panel_3); + panel_3.setLayout(new BorderLayout(0, 0)); + + upSpeedLabel = new DoubleBandwidthLabel("? ? ?"); + upSpeedLabel.setLabelForeground(Color.RED); + upSpeedLabel.setFont(new Font("微软雅黑", Font.PLAIN, 23)); + panel_3.add(upSpeedLabel, BorderLayout.EAST); + + JPanel panel_4 = new JPanel(); + panel_2.add(panel_4); + panel_4.setLayout(new BorderLayout(0, 0)); + + downSpeedLabel = new DoubleBandwidthLabel("? ? ?"); + downSpeedLabel.setLabelForeground(Color.GREEN); + downSpeedLabel.setFont(new Font("微软雅黑", Font.PLAIN, 23)); + panel_4.add(downSpeedLabel, BorderLayout.EAST); + + JPanel panel_5 = new JPanel(); + panel_2.add(panel_5); + panel_5.setLayout(new BorderLayout(0, 0)); + + upPPSLabel = new JLabel("? ? ?PPS"); + upPPSLabel.setPreferredSize(new Dimension(140, 50)); + upPPSLabel.setHorizontalAlignment(SwingConstants.CENTER); + upPPSLabel.setForeground(Color.RED); + upPPSLabel.setFont(new Font("微软雅黑", Font.PLAIN, 23)); + panel_5.add(upPPSLabel, BorderLayout.EAST); + + JPanel panel_6 = new JPanel(); + panel_2.add(panel_6); + panel_6.setLayout(new BorderLayout(0, 0)); + + downPPSLabel = new JLabel("? ? ?PPS"); + downPPSLabel.setPreferredSize(new Dimension(140, 50)); + downPPSLabel.setHorizontalAlignment(SwingConstants.CENTER); + downPPSLabel.setForeground(Color.GREEN); + downPPSLabel.setFont(new Font("微软雅黑", Font.PLAIN, 23)); + panel_6.add(downPPSLabel, BorderLayout.EAST); + + + { + upSpeed = new DefaultValueDataset(0); + upDataSpeed = new DefaultValueDataset(0); + DialPlot dpup = new DialPlot(); + dpup.setDataset(1, upSpeed); + dpup.setDataset(0, upDataSpeed); + StandardDialFrame sdfs = new StandardDialFrame(); + sdfs.setVisible(false); + dpup.setDialFrame(sdfs); + StandardDialScale sds = new StandardDialScale(0, 100, -120, -300, 10, 5); + sds.setTickRadius(0.9); + sds.setTickLabelsVisible(false); + dpup.addScale(0, sds); + + StandardDialRange sdrr = new StandardDialRange(0, 70, Color.GREEN); + sdrr.setInnerRadius(0.92); + sdrr.setOuterRadius(0.93); + dpup.addLayer(sdrr); + + StandardDialRange sdrr2 = new StandardDialRange(70, 90, Color.YELLOW); + sdrr2.setInnerRadius(0.92); + sdrr2.setOuterRadius(0.93); + dpup.addLayer(sdrr2); + + StandardDialRange sdrr3 = new StandardDialRange(90, 100, Color.RED); + sdrr3.setInnerRadius(0.92); + sdrr3.setOuterRadius(0.93); + dpup.addLayer(sdrr3); + + DialPointer.Pointer dpd = new DialPointer.Pointer(); + dpd.setRadius(0.8); + dpd.setFillPaint(new Color(127, 0, 0, 0)); + dpd.setOutlinePaint(new Color(127, 0, 0)); + dpd.setDatasetIndex(0); + //dpup.addLayer(dpd); + + DialPointer.Pointer dp = new DialPointer.Pointer(); + dp.setRadius(0.8); + dp.setFillPaint(Color.RED); + dp.setOutlinePaint(Color.RED); + dp.setDatasetIndex(1); + dpup.addLayer(dp); + + upSpeedText = new DialTextAnnotation("0%"); + upSpeedText.setFont(UIEnv.getFont().deriveFont(20.0f)); + dpup.addLayer(upSpeedText); + + JFreeChart jfup = new JFreeChart(dpup); + jfup.setBorderPaint(Color.WHITE); + jfup.setTitle(UIEnv.getRsb().getString("uploadspeed")); + jfup.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); + jfup.getTitle().setPosition(RectangleEdge.BOTTOM); + dpup.setView(0, 0, 1, 1); + ChartPanel cpup = new ChartPanel(jfup); + cpup.setPreferredSize(dashSize); + cpup.setSize(dashSize); + cpup.setMinimumSize(dashSize); + cpup.setBackground(Color.WHITE); + cpup.setBorder(new LineBorder(Color.LIGHT_GRAY)); + panel_3.add(cpup, BorderLayout.WEST); + + downSpeed = new DefaultValueDataset(0); + downDataSpeed = new DefaultValueDataset(0); + DialPlot dpup1 = new DialPlot(); + dpup1.setDataset(1, downSpeed); + dpup1.setDataset(0, downDataSpeed); + StandardDialFrame sdfs1 = new StandardDialFrame(); + sdfs1.setVisible(false); + dpup1.setDialFrame(sdfs1); + StandardDialScale sds1 = new StandardDialScale(0, 100, -120, -300, 10, 5); + sds1.setTickRadius(0.9); + sds1.setTickLabelsVisible(false); + dpup1.addScale(0, sds1); + + StandardDialRange sdrr1 = new StandardDialRange(0, 70, Color.GREEN); + sdrr1.setInnerRadius(0.92); + sdrr1.setOuterRadius(0.93); + dpup1.addLayer(sdrr1); + + StandardDialRange sdrr21 = new StandardDialRange(70, 90, Color.YELLOW); + sdrr21.setInnerRadius(0.92); + sdrr21.setOuterRadius(0.93); + dpup1.addLayer(sdrr21); + + StandardDialRange sdrr31 = new StandardDialRange(90, 100, Color.RED); + sdrr31.setInnerRadius(0.92); + sdrr31.setOuterRadius(0.93); + dpup1.addLayer(sdrr31); + + DialPointer.Pointer dp11 = new DialPointer.Pointer(); + dp11.setRadius(0.8); + dp11.setFillPaint(new Color(0, 127, 0, 0)); + dp11.setOutlinePaint(new Color(0, 127, 0)); + dp11.setDatasetIndex(0); + //dpup1.addLayer(dp11); + + DialPointer.Pointer dp1 = new DialPointer.Pointer(); + dp1.setRadius(0.8); + dp1.setFillPaint(Color.GREEN); + dp1.setOutlinePaint(Color.GREEN); + dp1.setDatasetIndex(1); + dpup1.addLayer(dp1); + + downSpeedText = new DialTextAnnotation("0%"); + downSpeedText.setFont(UIEnv.getFont().deriveFont(20.0f)); + dpup1.addLayer(downSpeedText); + + JFreeChart jfup1 = new JFreeChart(dpup1); + jfup1.setBorderPaint(Color.WHITE); + jfup1.setTitle(UIEnv.getRsb().getString("downloadspeed")); + jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); + jfup1.getTitle().setPosition(RectangleEdge.BOTTOM); + dpup1.setView(0, 0, 1, 1); + ChartPanel cpup1 = new ChartPanel(jfup1); + cpup1.setPreferredSize(dashSize); + cpup1.setSize(dashSize); + cpup1.setMinimumSize(dashSize); + cpup1.setBackground(Color.WHITE); + cpup1.setBorder(new LineBorder(Color.LIGHT_GRAY)); + panel_4.add(cpup1, BorderLayout.WEST); + + } + { + upPPS = new DefaultValueDataset(0); + upDataPPS = new DefaultValueDataset(0); + DialPlot dpup = new DialPlot(); + dpup.setDataset(1, upPPS); + dpup.setDataset(0, upDataPPS); + StandardDialFrame sdfs = new StandardDialFrame(); + sdfs.setVisible(false); + dpup.setDialFrame(sdfs); + StandardDialScale sds = new StandardDialScale(0, 100, -120, -300, 10, 5); + sds.setTickRadius(0.9); + sds.setTickLabelsVisible(false); + dpup.addScale(0, sds); + + StandardDialRange sdrr = new StandardDialRange(0, 70, Color.GREEN); + sdrr.setInnerRadius(0.92); + sdrr.setOuterRadius(0.93); + dpup.addLayer(sdrr); + + StandardDialRange sdrr2 = new StandardDialRange(70, 90, Color.YELLOW); + sdrr2.setInnerRadius(0.92); + sdrr2.setOuterRadius(0.93); + dpup.addLayer(sdrr2); + + StandardDialRange sdrr3 = new StandardDialRange(90, 100, Color.RED); + sdrr3.setInnerRadius(0.92); + sdrr3.setOuterRadius(0.93); + dpup.addLayer(sdrr3); + + DialPointer.Pointer dp1 = new DialPointer.Pointer(); + dp1.setRadius(0.8); + dp1.setFillPaint(new Color(127, 0, 0, 0)); + dp1.setOutlinePaint(new Color(127, 0, 0)); + dp1.setDatasetIndex(0); + //dpup.addLayer(dp1); + + DialPointer.Pointer dp = new DialPointer.Pointer(); + dp.setRadius(0.8); + dp.setFillPaint(Color.RED); + dp.setOutlinePaint(Color.RED); + dp.setDatasetIndex(1); + dpup.addLayer(dp); + + upPPSText = new DialTextAnnotation("0PPS"); + upPPSText.setFont(UIEnv.getFont().deriveFont(20.0f)); + dpup.addLayer(upPPSText); + + JFreeChart jfup = new JFreeChart(dpup); + jfup.setBorderPaint(Color.WHITE); + jfup.setTitle(UIEnv.getRsb().getString("uploadpps")); + jfup.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); + jfup.getTitle().setPosition(RectangleEdge.BOTTOM); + dpup.setView(0, 0, 1, 1); + ChartPanel cpup = new ChartPanel(jfup); + cpup.setPreferredSize(dashSize); + cpup.setSize(cpup.getPreferredSize()); + cpup.setBackground(Color.WHITE); + cpup.setBorder(new LineBorder(Color.LIGHT_GRAY)); + panel_5.add(cpup, BorderLayout.WEST); + + downPPS = new DefaultValueDataset(0); + downDataPPS = new DefaultValueDataset(0); + DialPlot dpup1 = new DialPlot(); + dpup1.setDataset(1, downPPS); + dpup1.setDataset(0, downDataPPS); + StandardDialFrame sdfs1 = new StandardDialFrame(); + sdfs1.setVisible(false); + dpup1.setDialFrame(sdfs1); + StandardDialScale sds1 = new StandardDialScale(0, 100, -120, -300, 10, 5); + sds1.setTickRadius(0.9); + sds1.setTickLabelsVisible(false); + dpup1.addScale(0, sds1); + + StandardDialRange sdrr1 = new StandardDialRange(0, 70, Color.GREEN); + sdrr1.setInnerRadius(0.92); + sdrr1.setOuterRadius(0.93); + dpup1.addLayer(sdrr1); + + StandardDialRange sdrr21 = new StandardDialRange(70, 90, Color.YELLOW); + sdrr21.setInnerRadius(0.92); + sdrr21.setOuterRadius(0.93); + dpup1.addLayer(sdrr21); + + StandardDialRange sdrr31 = new StandardDialRange(90, 100, Color.RED); + sdrr31.setInnerRadius(0.92); + sdrr31.setOuterRadius(0.93); + dpup1.addLayer(sdrr31); + + DialPointer.Pointer dp111 = new DialPointer.Pointer(); + dp111.setRadius(0.8); + dp111.setFillPaint(new Color(0, 127, 0, 0)); + dp111.setOutlinePaint(new Color(0, 127, 0)); + dp111.setDatasetIndex(0); + ///dpup1.addLayer(dp111); + DialPointer.Pointer dp11 = new DialPointer.Pointer(); + dp11.setRadius(0.8); + dp11.setFillPaint(Color.GREEN); + dp11.setOutlinePaint(Color.GREEN); + dp11.setDatasetIndex(1); + dpup1.addLayer(dp11); + + downPPSText = new DialTextAnnotation("0PPS"); + downPPSText.setFont(UIEnv.getFont().deriveFont(20.0f)); + dpup1.addLayer(downPPSText); + + JFreeChart jfup1 = new JFreeChart(dpup1); + jfup1.setBorderPaint(Color.WHITE); + jfup1.setTitle(UIEnv.getRsb().getString("downloadpps")); + jfup1.getTitle().setFont(UIEnv.getFont().deriveFont(22.0f)); + jfup1.getTitle().setPosition(RectangleEdge.BOTTOM); + dpup1.setView(0, 0, 1, 1); + ChartPanel cpup1 = new ChartPanel(jfup1); + cpup1.setPreferredSize(dashSize); + cpup1.setSize(cpup1.getPreferredSize()); + cpup1.setBackground(Color.WHITE); + cpup1.setBorder(new LineBorder(Color.LIGHT_GRAY)); + panel_6.add(cpup1, BorderLayout.WEST); + } + JPanel panel_top = new JPanel(); + panel_1.add(panel_top, BorderLayout.NORTH); + panel_top.setLayout(new GridLayout(0, 2, 0, 0)); + JPanel panel_7 = new JPanel(); + panel_7.setOpaque(false); + panel_top.add(panel_7); + panel_7.setLayout(new BorderLayout(0, 0)); + + sourceAddressField = new JTextField(); + panel_7.add(sourceAddressField); + sourceAddressField.setColumns(10); + + JLabel lblNewLabel_4 = new JLabel(""); + Image img2= getIcon2(); + if(img2!=null) + lblNewLabel_4.setIcon(new ImageIcon(img2)); + lblNewLabel_4.setHorizontalAlignment(SwingConstants.CENTER); + panel_7.add(lblNewLabel_4, BorderLayout.EAST); + panel_top.add(panel); + + + + progressBar = new JProgressBar(); + progressBar.setPreferredSize(new Dimension(100, 5)); + getContentPane().add(progressBar, BorderLayout.NORTH); + getTitlelabel().setFont(UIEnv.getFont().deriveFont(17.0f)); + getTitlepanel().setBorder(new LineBorder(Color.LIGHT_GRAY)); + getTitlelabel().setForeground(Color.WHITE); + + setTitle(UIEnv.getRsb().getString("klalbperf")); + setSize((int)(1200*0.7),(int)( 800*0.7)); + setLocationRelativeTo(comp); + tsk=new TimerTask() { + + @Override + public void run() { + if(monitor!=null) { + double outload = monitor.getOutSpeed() * 100.0 / monitor.getOutSpeedMax2(); + if (Double.isFinite(outload)) { + upSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getOutSpeedAvg()) + "/s"); + upSpeed.setValue(Math.min(upSpeed.getValue().doubleValue() * 0.98 + outload * 0.02, 101.0)); + } + + double inload = monitor.getInSpeed() * 100.0 / monitor.getInSpeedMax2(); + if (Double.isFinite(inload)) { + downSpeedText.setLabel(KLALBUtils.convertIBUint(monitor.getInSpeedAvg()) + "/s"); + downSpeed.setValue(Math.min(downSpeed.getValue().doubleValue() * 0.98 + inload * 0.02, 101.0)); + } + + double outPPSload = monitor.getOutPPS() * 100.0 / monitor.getOutPPSMax2(); + if (Double.isFinite(outPPSload)) { + upPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getOutPPSAvg()) + "PPS"); + upPPS.setValue(Math.min(upPPS.getValue().doubleValue() * 0.98 + outPPSload * 0.02, 101.0)); + } + + double inPPSload = monitor.getInPPS() * 100.0 / monitor.getInPPSMax2(); + if (Double.isFinite(inPPSload)) { + downPPSText.setLabel(KLALBUtils.convertUintDefalut(monitor.getInPPSAvg()) + "PPS"); + downPPS.setValue(Math.min(downPPS.getValue().doubleValue() * 0.98 + inPPSload * 0.02, 101.0)); + } + } + } + }; + tmr.scheduleAtFixedRate(tsk, 200, 100); + addWindowListener(new WindowListener() { + + @Override + public void windowOpened(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void windowIconified(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void windowDeiconified(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void windowDeactivated(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void windowClosing(WindowEvent e) { + if(tsk!=null) + tsk.cancel(); + } + + @Override + public void windowClosed(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void windowActivated(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + }); + } + private Image icon2; + private Image getIcon2() { + if(icon2==null) + try { + icon2=ImageIO.read(KperfGUI.class.getResourceAsStream("/assets/speedtest2.png")).getScaledInstance(20, 20, Image.SCALE_SMOOTH); + } catch (IOException e) { + e.printStackTrace(); + } + return icon2; + } + + private Image icon3; + + private DoubleBandwidthLabel upSpeedLabel; + + private DoubleBandwidthLabel downSpeedLabel; + + private JLabel upPPSLabel; + + private JLabel downPPSLabel; + private Image getIcon3() { + if(icon3==null) + try { + icon3=ImageIO.read(KperfGUI.class.getResourceAsStream("/assets/speedtest3.png")).getScaledInstance(20, 20, Image.SCALE_SMOOTH); + } catch (IOException e) { + e.printStackTrace(); + } + return icon3; + } + private void updateButton() { + if(kperf==null) { + startButton.setForeground(Color.GREEN); + startButton.setText(UIEnv.getRsb().getString("starttest")); + }else { + startButton.setForeground(Color.RED); + startButton.setText(UIEnv.getRsb().getString("stoptest")); + } + } + public void setTarget(MultipurposeSocketAddress target) { + targetAddressField.setText(target.toString()); + } + public void setTarget(MultipurposeSocketAddress target,MultipurposeSocketAddress source) { + targetAddressField.setText(target.toString()); + sourceAddressField.setText(source.toString()); + } +} diff --git a/src/org/kne/cloud/network/klalb/ui/LineMonitorGUI.java b/src/org/kne/cloud/network/klalb/ui/LineMonitorGUI.java index 0daeaaa..0397b30 100644 --- a/src/org/kne/cloud/network/klalb/ui/LineMonitorGUI.java +++ b/src/org/kne/cloud/network/klalb/ui/LineMonitorGUI.java @@ -1,6 +1,7 @@ package org.kne.cloud.network.klalb.ui; import java.awt.Color; +import java.awt.Component; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Image; @@ -9,10 +10,14 @@ import java.awt.image.BufferedImage; import java.io.IOException; import java.net.Inet6Address; import java.util.Date; +import java.util.Timer; +import java.util.TimerTask; import javax.imageio.ImageIO; import javax.swing.JPanel; import javax.swing.border.LineBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; @@ -36,16 +41,29 @@ import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.JButton; import java.awt.event.ActionListener; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; import java.awt.event.ActionEvent; import java.awt.Font; import javax.swing.SwingConstants; +import javax.swing.JSlider; public class LineMonitorGUI extends XFrame{ - private TimeSeries spdup=new TimeSeries("Upload speed"); - private TimeSeries spddown=new TimeSeries("Download speed"); + private Timer timer; + private Timer timer1; + private Timer timer2; + private TimerTask tsk3 ; + - private TimeSeries delayup=new TimeSeries("Upload delay"); - private TimeSeries delaydown=new TimeSeries("Download delay"); + private TimerTask tsk4 ,tsk5; + private TimerTask d1 ; + private TimerTask d2 ; + + private TimeSeries spdup=new TimeSeries(UIEnv.getRsb().getString("uploadspeed")); + private TimeSeries spddown=new TimeSeries(UIEnv.getRsb().getString("downloadspeed")); + + private TimeSeries delayup=new TimeSeries(UIEnv.getRsb().getString("uploaddelay")); + private TimeSeries delaydown=new TimeSeries(UIEnv.getRsb().getString("downloaddelay")); //private TimeSeries delayupmin=new TimeSeries("Upload delay minimum"); //private TimeSeries delaydownmin=new TimeSeries("Download delay minimum"); @@ -56,11 +74,15 @@ public class LineMonitorGUI extends XFrame{ private JFreeChart jfce; private JLabel spdp; private JLabel delp; + private long timeRange=5000; + private long[]values=new long[] {1000,2000,5000,10000,20000,50000,100000,200000,500000,1000000}; + private JPanel panel_1; + private JLabel lblNewLabel; //private ChartPanel delp; //private ChartPanel spdp; public LineMonitorGUI(KLALBRemoteLine t) { this.tr=t; - setSize(700, 700); + setSize(1200, 780); setLocationRelativeTo(null); setIconImage(UIEnv.getIcon()); @@ -77,8 +99,7 @@ public class LineMonitorGUI extends XFrame{ TimeSeriesCollection tsc=new TimeSeriesCollection(); tsc.addSeries(spdup); tsc.addSeries(spddown); - jfc = ChartFactory.createTimeSeriesChart("Speed monitor", "Time(s)", "Speed(KiB/s)", tsc); - jfc.getXYPlot().getDomainAxis().setFixedAutoRange(5000); + jfc = ChartFactory.createTimeSeriesChart(UIEnv.getRsb().getString("speermonitor"), UIEnv.getRsb().getString("time")+"(s)", UIEnv.getRsb().getString("speed")+"(KiB/s)", tsc); jfc.getXYPlot().setBackgroundPaint(Color.BLACK); jfc.getXYPlot().getRenderer().setSeriesPaint(0,Color.RED); jfc.getXYPlot().getRenderer().setSeriesPaint(1,Color.GREEN); @@ -93,8 +114,7 @@ public class LineMonitorGUI extends XFrame{ //tsce.addSeries(delayupmin); //tsce.addSeries(delaydownmin); - jfce = ChartFactory.createTimeSeriesChart("Delay monitor", "Time(s)", "Delay(ms)", tsce); - jfce.getXYPlot().getDomainAxis().setFixedAutoRange(5000); + jfce = ChartFactory.createTimeSeriesChart(UIEnv.getRsb().getString("delaymonitor"), UIEnv.getRsb().getString("time")+"(s)", UIEnv.getRsb().getString("delay")+"(ms)", tsce); jfce.getXYPlot().setBackgroundPaint(Color.BLACK); jfce.getXYPlot().getRenderer().setSeriesPaint(0,Color.RED); jfce.getXYPlot().getRenderer().setSeriesPaint(1,Color.GREEN); @@ -121,29 +141,28 @@ public class LineMonitorGUI extends XFrame{ panel.add(vaddrs); vaddrs.setColumns(10); - JPanel panel_1 = new JPanel(); - panel_1.setOpaque(false); + panel_1 = new JPanel(); panel.add(panel_1); - Dimension dms=new Dimension(140, 20); - JButton btnNewButton = new JButton("Force disconnect"); - btnNewButton.setPreferredSize(dms); - btnNewButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - tr.dislink(); - } - }); - btnNewButton.setForeground(Color.RED); - panel_1.add(btnNewButton); + panel_1.setLayout(new BorderLayout(0, 0)); - JButton btnNewButton_1 = new JButton("Force reconnect"); - btnNewButton_1.setPreferredSize(dms); - btnNewButton_1.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - tr.reconnectImmediately(); + JSlider windowSlider = new JSlider(); + windowSlider.setValue(2); + windowSlider.setMaximum(9); + panel_1.add(windowSlider, BorderLayout.CENTER); + JLabel windowSelect = new JLabel("5s"); + windowSlider.addChangeListener(new ChangeListener() { + + @Override + public void stateChanged(ChangeEvent e) { + updateTimeRange(windowSlider,windowSelect); } }); - btnNewButton_1.setForeground(Color.GREEN); - panel_1.add(btnNewButton_1); + updateTimeRange(windowSlider,windowSelect); + panel_1.add(windowSelect, BorderLayout.EAST); + + lblNewLabel = new JLabel(UIEnv.getRsb().getString("timerange")); + panel_1.add(lblNewLabel, BorderLayout.WEST); + Dimension dms=new Dimension(140, 20); /*JButton btnNewButton_2 = new JButton("Pressure test"); btnNewButton_2.setPreferredSize(dms); @@ -154,6 +173,60 @@ public class LineMonitorGUI extends XFrame{ }); panel_1.add(btnNewButton_2); btnNewButton_2.setForeground(Color.BLUE);*/ + addWindowListener(new WindowListener() { + + @Override + public void windowOpened(WindowEvent e) { + + } + + @Override + public void windowIconified(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void windowDeiconified(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void windowDeactivated(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void windowClosing(WindowEvent e) { + + } + + @Override + public void windowClosed(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void windowActivated(WindowEvent e) { + // TODO 自动生成的方法存根 + + } + }); + } + protected void updateTimeRange(JSlider windowSlider,JLabel windowSelect) { + timeRange=values[windowSlider.getValue()]; + synchronized (jfc) { + + jfc.getXYPlot().getDomainAxis().setFixedAutoRange(timeRange); + } + synchronized (jfce) { + + jfce.getXYPlot().getDomainAxis().setFixedAutoRange(timeRange); + } + windowSelect.setText(timeRange/1000+"s"); } private void changeFont(JFreeChart jfc2) { jfc2.getTitle().setFont(UIEnv.getFont().deriveFont(16.0f)); @@ -163,23 +236,116 @@ public class LineMonitorGUI extends XFrame{ jfc2.getXYPlot().getDomainAxis().setLabelFont(UIEnv.getFont()); jfc2.getXYPlot().getDomainAxis().setTickLabelFont(UIEnv.getFont()); } - public void recordData() { + private void recordSpeedData() { if(isVisible()) { Millisecond ms= new Millisecond(); + + synchronized (jfc) { spdup.addOrUpdate(ms, tr.getMonitor().getOutSpeed()/1024.0); spddown.addOrUpdate(ms, tr.getMonitor().getInSpeed()/1024.0); - + } - //Millisecond msu= new Millisecond(new Date(System.currentTimeMillis()-(System.nanoTime()- tr.getMonitor().getRecentPingNanoTime())/1000000L)); - delayup.addOrUpdate(ms, (tr.getMonitor().getOutDelay()+tr.getMonitor().getQueueingDelay())/1000000.0); - delaydown.addOrUpdate(ms, tr.getMonitor().getInDelay()/1000000.0); - //Millisecond msup= new Millisecond(new Date( tr.getMonitor().getUpdateDelayTime()+tr.getMonitor().getOutDelay()/1000000L)); - //delayupmin.addOrUpdate(ms, tr.getMonitor().getQueueingDelay()/1000000.0); - //delaydownmin.addOrUpdate(ms, tr.getMonitor().getInDelayPredicted()/1000000.0); } } + private void recordDelayData() { + if(isVisible()) { + Millisecond ms= new Millisecond(); + + + + synchronized (jfce) { + delayup.addOrUpdate(ms, (tr.getMonitor().getOutDelay()+tr.getMonitor().getQueueingDelay())/1000000.0); + delaydown.addOrUpdate(ms, tr.getMonitor().getInDelay()/1000000.0); + } + + } + } + @Override + public void setVisible(boolean b) { + if(b) { + if(timer==null) { + timer=new Timer(); + timer1=new Timer(); + timer2=new Timer(); + tsk3= new TimerTask() { + + @Override + public void run() { + updateTraffic(); + } + }; + tsk4= new TimerTask() { + + @Override + public void run() { + recordSpeedData(); + } + }; + + tsk5= new TimerTask() { + + @Override + public void run() { + recordDelayData(); + } + }; + d1= new TimerTask() { + + @Override + public void run() { + if(isVisible()) { + synchronized (jfc) { + ImageIcon i1=new ImageIcon(jfc.createBufferedImage(spdp.getWidth(), spdp.getHeight())); + spdp.setIcon(i1); + } + } + } + }; + d2= new TimerTask() { + + @Override + public void run() { + if(isVisible()) { + synchronized (jfce) { + ImageIcon i2=new ImageIcon(jfce.createBufferedImage(delp.getWidth(), delp.getHeight())); + delp.setIcon(i2); + } + + + } + } + }; + timer.scheduleAtFixedRate(tsk3, 25, 25); + timer1.scheduleAtFixedRate(tsk4, 5, 5); + timer1.scheduleAtFixedRate(d1, 25, 25); + timer2.scheduleAtFixedRate(tsk5, 5, 5); + timer2.scheduleAtFixedRate(d2, 25, 25); + } + + }else { + if(tsk3!=null) + tsk3.cancel(); + if(tsk4!=null) + tsk4.cancel(); + if(tsk5!=null) + tsk5.cancel(); + if(d1!=null) + d1.cancel(); + if(d2!=null) + d2.cancel(); + if(timer!=null) + timer.cancel(); + if(timer1!=null) + timer1.cancel(); + + if(timer2!=null) + timer2.cancel(); + timer=null; + } + super.setVisible(b); + } public void updateTraffic() { switch (tr.getMonitor().getState()) { case MonitorData.OFFLINE: @@ -197,12 +363,6 @@ public class LineMonitorGUI extends XFrame{ break; } if(isVisible()) { - //long ax=System.nanoTime(); - ImageIcon i1=new ImageIcon(jfc.createBufferedImage(spdp.getWidth(), spdp.getHeight())); - ImageIcon i2=new ImageIcon(jfce.createBufferedImage(delp.getWidth(), delp.getHeight())); - //System.out.println(System.nanoTime()-ax); - spdp.setIcon(i1); - delp.setIcon(i2); //spddown.fireSeriesChanged(); //delaydown.fireSeriesChanged(); Inet6AddressGroup irg=tr.getRemoteVaddr(); diff --git a/src/org/kne/cloud/network/klalb/ui/NetworkGraphPanel.java b/src/org/kne/cloud/network/klalb/ui/NetworkGraphPanel.java index b6dbbcf..275371b 100644 --- a/src/org/kne/cloud/network/klalb/ui/NetworkGraphPanel.java +++ b/src/org/kne/cloud/network/klalb/ui/NetworkGraphPanel.java @@ -10,6 +10,12 @@ import java.awt.Graphics2D; import java.awt.Image; import java.awt.Rectangle; import java.awt.Shape; +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; import java.awt.geom.Dimension2D; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; @@ -27,34 +33,128 @@ import java.util.Random; import java.util.Set; import javax.swing.JButton; +import javax.swing.JMenuItem; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.border.LineBorder; +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.klalb.KLALBController; import org.kne.cloud.network.klalb.KLALBUtils; import org.kne.cloud.network.srv6.KLALBRoutingProtocol; import org.kne.cloud.network.srv6.KLALBRoutingProtocol.LinkDirection; public class NetworkGraphPanel extends GraphPanel { - private KLALBRoutingProtocol routingProtocol; + private KLALBController controller; + private KLALBStateGUI3 klbgui; - public NetworkGraphPanel(KLALBRoutingProtocol routingProtocol) { + public NetworkGraphPanel(KLALBController controller,KLALBStateGUI3 klbgui) { super(); - this.routingProtocol = routingProtocol; + this.controller = controller; + this.klbgui=klbgui; } + public NetworkGraphPanel(KLALBController kc) { + this(kc,null); + } + private class InetGraphNode extends GraphNode{ private InetAddress address; + private JPopupMenu popupMenu; public InetGraphNode() { super(); + initign(); } public InetGraphNode(InetAddress address, Color color, double x, double y, boolean ismarked) { super(getText(address), color, x, y, ismarked); this.address=address; + initign(); } + private void initign() { + popupMenu = new JPopupMenu(); + + JMenuItem mcpyitm = new JMenuItem(UIEnv.getRsb().getString("copyvirtualaddress")); + mcpyitm.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(address.getHostAddress()), null); + } + }); + popupMenu.add(mcpyitm); + + JMenuItem ninfom = new JMenuItem(UIEnv.getRsb().getString("nodeinf")); + ninfom.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + openInformation(); + } + }); + popupMenu.add(ninfom); + + JMenuItem kperfitm = new JMenuItem(UIEnv.getRsb().getString("speedtest")); + kperfitm.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + KperfGUI kpfg=new KperfGUI(); + kpfg.setVisible(true); + MultipurposeSocketAddress source=new MultipurposeSocketAddress("KLALB_Stream",controller.getIpv6Router().getLocator().getAddress().getHostAddress(),0); + MultipurposeSocketAddress target=new MultipurposeSocketAddress("KLALB_Stream", address.getHostAddress(), 4564); + kpfg.setTarget(target,source); + } + }); + popupMenu.add(kperfitm); + + + addMouseListener(new MouseListener() { + + @Override + public void mouseReleased(MouseEvent e) { + if(e.isPopupTrigger()) + popupMenu.show(NetworkGraphPanel.this,e.getX(),e.getY()); + } + + @Override + public void mousePressed(MouseEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void mouseExited(MouseEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void mouseEntered(MouseEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void mouseClicked(MouseEvent e) { + if(e.getClickCount()==2&&e.getButton()==MouseEvent.BUTTON1) { + openInformation(); + } + } + }); + } + + protected void openInformation() { + Image cimg=getCurrentImage(); + NodeInformationPanel pan=new NodeInformationPanel(controller, address,cimg.getScaledInstance(cimg.getWidth(null)/5, cimg.getHeight(null)/5, Image.SCALE_SMOOTH)); + klbgui.addNodeInformationPanel(pan); + } + + + private static String getText(InetAddress address2) { String text; if(address2 instanceof Inet6Address) { @@ -92,13 +192,13 @@ public class NetworkGraphPanel extends GraphPanel { } } protected void loadNodes() { - Map addr= routingProtocol.getAddresses(); + Map addr= controller.getIpv6Router().getKlalbRouteProtol().getAddresses(); Set ks=addr.keySet(); for (Iterator iterator = ks.iterator(); iterator.hasNext();) { Inet6Address inet6Address = (Inet6Address) iterator.next(); if(!getNodes().containsKey(inet6Address)) { Vector2 v2pos=super.getRandomPos(); - getNodes().put(inet6Address,new InetGraphNode(inet6Address,Color.BLACK,v2pos.x,v2pos.y,inet6Address.equals(routingProtocol.getRouter().getLocator().getAddress()))); + getNodes().put(inet6Address,new InetGraphNode(inet6Address,Color.BLACK,v2pos.x,v2pos.y,inet6Address.equals(controller.getIpv6Router().getLocator().getAddress()))); } } Set kns=getNodes().keySet(); @@ -112,7 +212,7 @@ public class NetworkGraphPanel extends GraphPanel { synchronized (getEdgeGroups()) { getEdgeGroups().clear(); - Map> addr1= routingProtocol.getPaths(); + Map> addr1= controller.getIpv6Router().getKlalbRouteProtol().getPaths(); Set>> salink=addr1.entrySet(); for (Iterator>> iterator = salink.iterator(); iterator.hasNext();) { Entry> entry = (Entry>) iterator.next(); @@ -147,8 +247,8 @@ public class NetworkGraphPanel extends GraphPanel { } } GraphEdgeGroup ng=new InetGraphEdgeGroup(a, b); - Inet6Address aprev= routingProtocol.getDijkstraPrevNode((Inet6Address) a.getAddress()); - Inet6Address bprev= routingProtocol.getDijkstraPrevNode((Inet6Address) b.getAddress()); + Inet6Address aprev= controller.getIpv6Router().getKlalbRouteProtol().getDijkstraPrevNode((Inet6Address) a.getAddress()); + Inet6Address bprev= controller.getIpv6Router().getKlalbRouteProtol().getDijkstraPrevNode((Inet6Address) b.getAddress()); if( b.getAddress().equals(aprev)||a.getAddress().equals(bprev)) { ng.setShortest(true); diff --git a/src/org/kne/cloud/network/klalb/ui/NetworkInterfaceListSettingItem.java b/src/org/kne/cloud/network/klalb/ui/NetworkInterfaceListSettingItem.java new file mode 100644 index 0000000..34dc2d3 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/NetworkInterfaceListSettingItem.java @@ -0,0 +1,36 @@ +package org.kne.cloud.network.klalb.ui; + +import java.awt.Font; +import java.net.NetworkInterface; +import java.util.List; + +import org.kne.cloud.klalb.uitool.ListSettingItem; +import org.kne.cloud.klalb.uitool.XDefaultListModel; + +public class NetworkInterfaceListSettingItem extends ListSettingItem{ + + private XDefaultListModel model; + + public NetworkInterfaceListSettingItem(String text, Font deriveFont, int w, int h, + XDefaultListModel lm) { + super(text, deriveFont, w, h, lm); + this.model=lm; + } + + public NetworkInterfaceListSettingItem(String text, int w, int h, XDefaultListModel lm) { + super(text, w, h, lm); + this.model=lm; + } + + @Override + protected void runEdit(NetworkInterface val) { + + } + + @Override + protected List createEmpty() { + new NetworkInterfaceSelector(model); + return null; + } + +} diff --git a/src/org/kne/cloud/network/klalb/ui/NetworkInterfaceSelector.java b/src/org/kne/cloud/network/klalb/ui/NetworkInterfaceSelector.java new file mode 100644 index 0000000..b71aa61 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/NetworkInterfaceSelector.java @@ -0,0 +1,87 @@ +package org.kne.cloud.network.klalb.ui; + +import java.awt.Color; +import java.awt.Component; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.swing.border.LineBorder; + +import org.kne.cloud.klalb.uitool.XDefaultListModel; +import org.kne.ui.XFrame; +import javax.swing.JScrollPane; +import java.awt.BorderLayout; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +public class NetworkInterfaceSelector extends XFrame{ + private JList list; + public NetworkInterfaceSelector(XDefaultListModel model) { + this(model,null); + } + + public NetworkInterfaceSelector(XDefaultListModel model,Component relate) { + // setResizable(false); + setIconImage(UIEnv.getIcon()); + // setTitleColor(new Color(255, 255, 255, 250)); + setTitleColor(UIEnv.getDefaultTitleColor()); + getContentPane().setBackground(UIEnv.getDefaultBackgroundColor()); + setTitle(UIEnv.getRsb().getString("selectinterface")); + JScrollPane scrollPane = new JScrollPane(); + getContentPane().add(scrollPane, BorderLayout.CENTER); + XDefaultListModel nif=new XDefaultListModel<>(); + list = new JList(nif); + scrollPane.setViewportView(list); + + JPanel panel = new JPanel(); + getContentPane().add(panel, BorderLayout.SOUTH); + + JButton cancel = new JButton(UIEnv.getRsb().getString("cancel")); + cancel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + panel.add(cancel); + + JButton ok = new JButton(UIEnv.getRsb().getString("ok")); + ok.addActionListener(new ActionListener() { + @SuppressWarnings("unchecked") + public void actionPerformed(ActionEvent e) { + model.addAll(list.getSelectedValuesList()); + setVisible(false); + } + }); + panel.add(ok); + getTitlelabel().setFont(UIEnv.getFont().deriveFont(17.0f)); + getTitlepanel().setBorder(new LineBorder(Color.LIGHT_GRAY)); + getTitlelabel().setForeground(Color.WHITE); + // getContentPane().setBackground(new Color(0,0,0,0)); + setSize(1280/2, 720/2); + setLocationRelativeTo(relate); + + Enumeration eu; + try { + eu = NetworkInterface.getNetworkInterfaces(); + + while (eu.hasMoreElements()) { + NetworkInterface networkInterface = (NetworkInterface) eu.nextElement(); + if(networkInterface.isUp()) + nif.addElement(networkInterface); + } + } catch (SocketException e) { + e.printStackTrace(); + } + + setVisible(true); + } + + +} diff --git a/src/org/kne/cloud/network/klalb/ui/NodeInformationPanel.java b/src/org/kne/cloud/network/klalb/ui/NodeInformationPanel.java new file mode 100644 index 0000000..3abb48a --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/NodeInformationPanel.java @@ -0,0 +1,167 @@ +package org.kne.cloud.network.klalb.ui; + +import java.awt.BorderLayout; +import java.awt.Image; +import java.awt.Toolkit; +import java.awt.datatransfer.StringSelection; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.util.List; + +import javax.swing.AbstractAction; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import org.kne.cloud.klalb.uitool.XDefaultListModel; +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.klalb.KLALBController; +import org.kne.cloud.network.srv6.KLALBRoutingProtocol; +import org.kne.cloud.network.srv6.KLALBRoutingProtocolAPIClient; +import javax.swing.JTabbedPane; +import javax.swing.JList; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; + +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.ActionEvent; + +public class NodeInformationPanel extends JPanel { + private InetAddress address; + private KLALBRoutingProtocolAPIClient client; + private KLALBController controller; + private Image image; + + private XDefaultListModel listModel=new XDefaultListModel<>(); + public KLALBController getController() { + return controller; + } + public InetAddress getAddress() { + return address; + } + + public Image getImage() { + return image; + } + public NodeInformationPanel (KLALBController controller,InetAddress address,Image image) { + this.controller=controller; + this.address=address; + this.image=image; + setLayout(new BorderLayout(0, 0)); + + JScrollPane scrollPane = new JScrollPane(); + + JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); + add(tabbedPane, BorderLayout.CENTER); + + JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout(0, 0)); + tabbedPane.addTab(UIEnv.getRsb().getString("overview"), null, panel, null); + + JPanel panel_1 = new JPanel(); + panel_1.setLayout(new BorderLayout(0, 0)); + panel_1.add(scrollPane); + + JList list = new JList(listModel); + list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + scrollPane.setViewportView(list); + tabbedPane.addTab(UIEnv.getRsb().getString("openlinetable"), null, panel_1, null); + + JButton btnNewButton = new JButton(UIEnv.getRsb().getString("addline")); + btnNewButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + List select=list.getSelectedValuesList(); + controller.addRemoteLines(select); + } + }); + btnNewButton.setEnabled(false); + JPopupMenu jpop=new JPopupMenu(); + JMenuItem copy=new JMenuItem(UIEnv.getRsb().getString("copy")); + copy.setEnabled(false); + list.addListSelectionListener(new ListSelectionListener() { + + @Override + public void valueChanged(ListSelectionEvent e) { + List select=list.getSelectedValuesList(); + btnNewButton.setEnabled( !select.isEmpty()) ; + copy.setEnabled(!select.isEmpty()); + } + }); + copy.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + StringBuilder sb=new StringBuilder(); + List select=list.getSelectedValuesList(); + for (MultipurposeSocketAddress multipurposeSocketAddress : select) { + sb.append(multipurposeSocketAddress); + sb.append('\n'); + } + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(sb.toString()), null); + } + }); + jpop.add(copy); + list.addMouseListener(new MouseListener() { + + @Override + public void mouseReleased(MouseEvent e) { + if(e.isPopupTrigger()) { + jpop.show(list, e.getX(), e.getY()); + } + } + + @Override + public void mousePressed(MouseEvent e) { + if(e.isPopupTrigger()) { + jpop.show(list, e.getX(), e.getY()); + } + } + + @Override + public void mouseExited(MouseEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void mouseEntered(MouseEvent e) { + // TODO 自动生成的方法存根 + + } + + @Override + public void mouseClicked(MouseEvent e) { + if(e.isPopupTrigger()) { + jpop.show(list, e.getX(), e.getY()); + } + } + }); + + panel_1.add(btnNewButton, BorderLayout.SOUTH); + + client=new KLALBRoutingProtocolAPIClient(controller.getIpv6Router().getKlalbRouteProtol()); + try { + client.requestOpenLines(new InetSocketAddress(address, KLALBRoutingProtocol.DEFAULT_PORT), (result)->{ + listModel.clear(); + for (MultipurposeSocketAddress multipurposeSocketAddress : result) { + listModel.addElement(multipurposeSocketAddress); + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + public Icon getIcon() { + return new ImageIcon(image); + } +} diff --git a/src/org/kne/cloud/network/klalb/ui/TPanel2.java b/src/org/kne/cloud/network/klalb/ui/TPanel2.java index 120badb..9a40886 100644 --- a/src/org/kne/cloud/network/klalb/ui/TPanel2.java +++ b/src/org/kne/cloud/network/klalb/ui/TPanel2.java @@ -305,8 +305,8 @@ public class TPanel2 extends JPanel { private void updateText() { - targup.setText(KLALBUtils. bytesUnit(tunnel.getMonitor().getOutTraffic()) + "\u2191 " + KLALBUtils. bytesUnit(tunnel.getMonitor().getOutSpeedAvg()) + "/s\u2191 "+ String.format("%.1f", tunnel.getMonitor().getOutDelay()/1000000.0) + "ms"); - targdown.setText(KLALBUtils. bytesUnit(tunnel.getMonitor().getInTraffic()) + "\u2193 " + KLALBUtils. bytesUnit(tunnel.getMonitor().getInSpeedAvg()) + "/s\u2193 " + String.format("%.1f", tunnel.getMonitor().getInDelay()/1000000.0) + "ms"); + targup.setText(KLALBUtils. convertIBUint(tunnel.getMonitor().getOutTraffic()) + " " + KLALBUtils. convertIBUint(tunnel.getMonitor().getOutSpeedAvg()) + "/s "+ KLALBUtils.convertUintNanoDefalut(tunnel.getMonitor().getOutDelay()) + "s"); + targdown.setText(KLALBUtils. convertIBUint(tunnel.getMonitor().getInTraffic()) + " " + KLALBUtils. convertIBUint(tunnel.getMonitor().getInSpeedAvg()) + "/s " + KLALBUtils.convertUintNanoDefalut( tunnel.getMonitor().getInDelay()) + "s"); if(tunnel.getMonitor().getOutSpeed()>4096||tunnel.getMonitor().getInSpeed()>4096) { lblNewLabel_2.setBackground(Color.ORANGE); @@ -319,21 +319,6 @@ public class TPanel2 extends JPanel { return tunnel; } - private String bytesUnit(long v) { - if (v >= 1024L * 1024 * 1024 * 1024 * 1024) { - return String.format("%.1f", v / (1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)) + "PB"; - } else if (v >= 1024L * 1024 * 1024 * 1024) { - return String.format("%.1f", v / (1024.0 * 1024.0 * 1024.0 * 1024.0)) + "TB"; - } else if (v >= 1024L * 1024 * 1024) { - return String.format("%.1f", v / (1024.0 * 1024.0 * 1024.0)) + "GB"; - } else if (v >= 1024L * 1024) { - return String.format("%.1f", v / (1024.0 * 1024.0)) + "MB"; - } else if (v >= 1024L) { - return String.format("%.1f", v / (1024.0)) + "KB"; - } else { - return v + "B"; - } - } public void updateTraffic() { switch (tunnel.getMonitor().getState()) { diff --git a/src/org/kne/cloud/network/klalb/ui/TabPanel.java b/src/org/kne/cloud/network/klalb/ui/TabPanel.java new file mode 100644 index 0000000..7cb733b --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/TabPanel.java @@ -0,0 +1,60 @@ +package org.kne.cloud.network.klalb.ui; + +import java.awt.event.*; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +class TabPanel extends JPanel{ + private JLabel title; + private CloseButton closebutton; + private final JTabbedPane pane; + + public TabPanel(String s,JTabbedPane pane,Icon icon,String tip, boolean closable){ + super(new BorderLayout()); + title=new JLabel(s); + title.setIcon(icon); + title.setToolTipText(tip); + setToolTipText(tip); + this.pane=pane; + add(title,BorderLayout.CENTER); + if(closable) { + closebutton=new CloseButton(); + add(closebutton,BorderLayout.EAST); + } + title.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3)); + setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + setOpaque(false); + } + + private class CloseButton extends JButton { + private ImageIcon icon; + public CloseButton(){ + //图片的位置随自身情况而定 + try { + icon=new ImageIcon(ImageIO.read( getClass().getResource("/assets/close.png")).getScaledInstance(10, 10, Image.SCALE_SMOOTH)); + setSize(icon.getImage().getWidth(null),icon.getImage().getHeight(null)); + setIcon(icon); + } catch (IOException e1) { + // TODO 自动生成的 catch 块 + e1.printStackTrace(); + } + setContentAreaFilled(false); + setBorder(null); + setBorderPainted(false); + setFocusPainted(false); + try { + setRolloverIcon(new ImageIcon(ImageIO.read(getClass().getResource("/assets/close.png")).getScaledInstance(10, 10, Image.SCALE_SMOOTH))); + } catch (IOException e1) { + e1.printStackTrace(); + } + addMouseListener(new MouseAdapter(){ + public void mouseClicked(MouseEvent e){ + pane.remove(pane.indexOfTabComponent(TabPanel.this)); + } + }); + } + } + +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/klalb/ui/UIEnv.java b/src/org/kne/cloud/network/klalb/ui/UIEnv.java index bd79d47..a526789 100644 --- a/src/org/kne/cloud/network/klalb/ui/UIEnv.java +++ b/src/org/kne/cloud/network/klalb/ui/UIEnv.java @@ -102,7 +102,7 @@ public class UIEnv { } } icon=Toolkit.getDefaultToolkit().getImage( - UIEnv.class.getResource("/assets/KLALB.png")); + UIEnv.class.getResource("/assets/KLALB2.png")); } public static void defbut(JButton start) { if(font==null) diff --git a/src/org/kne/cloud/network/klalb/ui/UIUtils.java b/src/org/kne/cloud/network/klalb/ui/UIUtils.java new file mode 100644 index 0000000..a0f13a5 --- /dev/null +++ b/src/org/kne/cloud/network/klalb/ui/UIUtils.java @@ -0,0 +1,13 @@ +package org.kne.cloud.network.klalb.ui; + +import java.awt.Component; + +import javax.swing.Icon; +import javax.swing.JTabbedPane; + +public class UIUtils { + public static void addTab(JTabbedPane tabbedPane,String title,Icon icon,Component comp,String tip, boolean closable) { + tabbedPane.addTab(title,icon, comp,tip); + tabbedPane.setTabComponentAt(tabbedPane.getTabCount()-1, new TabPanel(title,tabbedPane,icon,tip,closable)); + } +} diff --git a/src/org/kne/cloud/network/minecraft/SimpleKLALBMinecraftClient.java b/src/org/kne/cloud/network/minecraft/SimpleKLALBMinecraftClient.java deleted file mode 100644 index f2a0fb5..0000000 --- a/src/org/kne/cloud/network/minecraft/SimpleKLALBMinecraftClient.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.kne.cloud.network.minecraft; - -import java.io.File; -import java.io.IOException; -import java.net.Inet6Address; -import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.net.UnknownHostException; -import java.util.Iterator; -import java.util.List; -import java.util.Properties; -import java.util.Scanner; - -import org.kne.cloud.network.MultipurposeSocketAddress; -import org.kne.cloud.network.SocketBridge; -import org.kne.cloud.network.SocketListener; -import org.kne.cloud.network.SocketToSocketProxy; -import org.kne.cloud.network.klalb.CONST; -import org.kne.cloud.network.klalb.KLALBController; -import org.kne.cloud.network.klalb.KLALBRemoteLine; -import org.kne.cloud.network.klalb.ui.KLALBStateGUI2; -import org.kne.util.AutoProperties; - -public class SimpleKLALBMinecraftClient { - public static KLALBStateGUI2 ksg; -public static void main(String[] args) throws UnknownHostException, IOException { - - System.out.println(CONST.klalb+" V"+CONST.klalbver); - Scanner scn=new Scanner(System.in); - Properties def=new Properties(); - def.setProperty("server", ""); - def.setProperty("local", ""); - AutoProperties ap=new AutoProperties(new File("klalbclient.ini"),def); - KLALBController kc=new KLALBController(); - kc.registerToProxyTypeAs("KLALB"); - MinecraftServerAddress msa=MinecraftServerAddress.findAddress(ap.getProperty("server")); - MinecraftServerPinger msp=new MinecraftServerPinger(msa); - if(msp.getKlalbversion()==null) { - System.out.println("服务器不支持加速!!"); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - System.exit(0); - } - Inet6Address vad= kc.getRemoteVaddrBySocketAddress(msa); - MultipurposeSocketAddress vmsa=new MultipurposeSocketAddress("KLALB_Stream",new InetSocketAddress(vad, msp.getKlalbvport())); - System.out.println("连接成功:"+ap.getProperty("server")); - new SocketToSocketProxy(new MultipurposeSocketAddress(ap.getProperty("local")), vmsa); - //System.out.println("提示:输入state并回车可以查看当前线路状态"); - while(true) { - String s=scn.nextLine(); - switch(s) { - case "help": - System.out.print("help:查看命令使用说明"); - System.out.print("state:查看线路状态"); - //System.out.println("reload:重新加载线路配置文件"); - System.out.println("reconnect:所有离线线路跳过重连等待时间立即尝试重连"); - System.out.println("monitor:显示监视器图形界面"); - System.out.println("stop:退出程序"); - break; - case "stop": - System.exit(0); - break; - case "state": - System.out.println("状态\t可靠性\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动"); - synchronized (kc.getLines()) { - for (Iterator iterator = kc.getLines().iterator(); iterator.hasNext();) { - KLALBRemoteLine hostPort = iterator.next(); - System.out.println(hostPort .toString()); - //System.out.println(); - } - } - break; - case "monitor": - if(ksg==null) - ksg=new KLALBStateGUI2(kc); - ksg.setVisible(true); - break; - case "reconnect": - kc.reconnectImmediately(); - break; - default : - System.out.println("未知命令,请输入help以查询命令说明"); - - } - } -} -} diff --git a/src/org/kne/cloud/network/minecraft/SimpleKLALBMinecraftServer.java b/src/org/kne/cloud/network/minecraft/SimpleKLALBMinecraftServer.java deleted file mode 100644 index 46faebe..0000000 --- a/src/org/kne/cloud/network/minecraft/SimpleKLALBMinecraftServer.java +++ /dev/null @@ -1,194 +0,0 @@ -package org.kne.cloud.network.minecraft; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Iterator; -import java.util.Scanner; - -import org.kne.cloud.network.MultipurposeSocketAddress; -import org.kne.cloud.network.ProtocolDetectorServerSocketFactory; -import org.kne.cloud.network.ProtocolDetectorSocket; -import org.kne.cloud.network.SocketListener; -import org.kne.cloud.network.SocketType; -import org.kne.cloud.network.klalb.CONST; -import org.kne.cloud.network.klalb.KLALBController; -import org.kne.cloud.network.klalb.KLALBRemoteLine; -import org.kne.cloud.network.klalb.KLALBVirtualSocket; -import org.kne.cloud.network.klalb.ServerPropties; -import org.kne.cloud.network.klalb.StreamKLALBPacketLink; - -public class SimpleKLALBMinecraftServer { - public static SocketListener tcpl,tcpl2; - public static ServerPropties sp; - public static KLALBController kc; - static { - MultipurposeSocketAddress.getSocketTypeRegister().put("DETTCP",new SocketType(null, new ProtocolDetectorServerSocketFactory())); - } - public static void main(String[] args) throws IOException { - - System.out.println(CONST.klalb+"[Minecraft版] V"+CONST.klalbver); - sp=new ServerPropties(); - - System.out.println("虚拟地址:"+sp.getVirtualIP().getHostAddress()); - kc=new KLALBController(sp.getVirtualIP()); - /*kc.setSelflineTableSupplier(()->{ - return fileRead("linetable.txt"); - });*/ - kc.registerToProxyTypeAs("KLALB"); - - System.out.println("开放端口:"+sp.getBind()); - openPort(sp.getBind()); - System.out.println("本地服务:"+sp.getLocal()); - openLocalPort(sp.getLocal()); - - - - Scanner scn=new Scanner(System.in); - while(true) { - String s=scn.next(); - String[]sc=s.split(" "); - switch(sc[0]) { - case "help": - System.out.print("state:查看线路状态"); - System.out.println("reload:重新加载线路配置"); - break; - case "state": - System.out.println("状态\t可靠性\t上传流量\t下载流量\t上传速度\t下载速度\t上传延迟\t下载延迟\t上传抖动\t下载抖动"); - for (Iterator iterator = kc.getLines().iterator(); iterator.hasNext();) { - KLALBRemoteLine hostPort = iterator.next(); - System.out.println(hostPort .toString()); - //System.out.println(); - } - break; - default: - System.out.println("未知命令,请输入help以查询指令说明"); - } - } - } - private static void openPort(String bip) throws IOException { - if(tcpl!=null) - tcpl.close(); - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(bip,"DETTCP"); - tcpl=new SocketListener(mpsa); - tcpl.setCon((soc)->{ - ProtocolDetectorSocket pds=(ProtocolDetectorSocket) soc; - if(!pds.getProtocolStack().isEmpty()&&pds.getProtocolStack().pop().getName().equals("KLALB")) { - KLALBRemoteLine krs=null; - try { - krs = new KLALBRemoteLine(new StreamKLALBPacketLink(pds)); - kc.addRemoteLine(krs); - } catch (IOException e) { - e.printStackTrace(); - } - }else { - MultipurposeSocketAddress mpsa2=new MultipurposeSocketAddress(sp.getLocal()); - Socket s=null; - try { - s=mpsa2.connectSocket(); - MinecraftSocketBridge dsb=new MinecraftSocketBridge(pds, s); - dsb.getBridgeBA().getTransformers().add(new KLALBJsonMotdInserter(()->{return kc.getSelf().getAddress();},()->{return 23333;})); - dsb.run(); - } catch (UnknownHostException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } catch (IOException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - }finally { - if(s!=null) - try { - s.close(); - } catch (IOException e1) { - // TODO 自动生成的 catch 块 - e1.printStackTrace(); - } - try { - soc.close(); - } catch (IOException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } - } - } - }); - } - private static void openLocalPort(String bip) throws IOException { - if(tcpl2!=null) - tcpl2.close(); - MultipurposeSocketAddress mpsa=new MultipurposeSocketAddress(bip); - tcpl2=new SocketListener(new MultipurposeSocketAddress("KLALB_Stream", "::0", 23333)); - tcpl2.setCon((soc)->{ - Socket s=null; - try { - s=mpsa.connectSocket(); - s.setTcpNoDelay(true); - //soc.setTcpNoDelay(true); - //((KLALBVirtualSocket) soc).setCompress(1); - MinecraftSocketBridge dsb=new MinecraftSocketBridge(soc, s); - dsb.getBridgeBA().getTransformers().add(new KLALBJsonMotdInserter(()->{return kc.getSelf().getAddress();},()->{return 23333;})); - //dsb.getSab().setDelay(1); - dsb.run(); - /*CompressedSocketBridge csb=new CompressedSocketBridge(s, soc); - csb.getSab().setDelay(1); - csb.run();*/ - } catch (UnknownHostException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } catch (IOException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - }finally { - if(s!=null) - try { - s.close(); - } catch (IOException e1) { - // TODO 自动生成的 catch 块 - e1.printStackTrace(); - } - try { - soc.close(); - } catch (IOException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } - } - - }); - } - private static String fileRead(String filePath){ - //1.定义一个BufferedReader对象,将文件内容读取到缓存 - BufferedReader bufferedReader =null; - String returnInfo=""; - try{ - // 2.定义一个file对象 - File file = new File(filePath);//定义一个file对象,用来初始化FileReader - // 3.定义一个fileReader对象 - FileReader reader = new FileReader(file); - // 4.定义一个BufferedReader对象,将文件内容读取到缓存 - bufferedReader = new BufferedReader(reader); - // 5.定义一个字符串缓存,将字符串存放缓存中 - StringBuilder stringBuilder = new StringBuilder(); - String str = ""; - while ((str =bufferedReader.readLine()) != null) {//逐行读取文件内容,不读取换行符和末尾的空格 - stringBuilder.append(str + "\n");//将读取的字符串添加换行符后累加存放在缓存中 - } - returnInfo = stringBuilder.toString(); - }catch (Exception e){ - e.printStackTrace(); - }finally { - try{ - if(bufferedReader!=null){ - bufferedReader.close(); - } - }catch (Exception e){ - e.printStackTrace(); - } - } - return returnInfo; - } - -} diff --git a/src/org/kne/cloud/network/monitor/ArrayListTimestampMonitor.java b/src/org/kne/cloud/network/monitor/ArrayListTimestampMonitor.java new file mode 100644 index 0000000..365967e --- /dev/null +++ b/src/org/kne/cloud/network/monitor/ArrayListTimestampMonitor.java @@ -0,0 +1,460 @@ +package org.kne.cloud.network.monitor; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.cloud.network.klalb.KLALBUtils; +import org.kne.math.Long128; + +public class ArrayListTimestampMonitor implements TimestampMonitor{ + + + + private HighAccuracyClock clock; + private String name; + + // 使用LongAdder替代AtomicLong,在高并发下性能更好 + private final LongAdder totalDataSize = new LongAdder(); + private final LongAdder totalPackets = new LongAdder(); + + // 配置参数 + private final int maxRetry; + private final long cleanupThreshold; + + // 使用ArrayList存储数据 + private final List entries = new ArrayList<>(); + + // 读写锁用于保护ArrayList的并发访问 + private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); + + // 时间戳验证容差(纳秒),考虑到网络延迟和时钟同步 + private static final long TIMESTAMP_TOLERANCE_NS = 10_000_000L; // 10毫秒 + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public HighAccuracyClock getClock() { + return clock; + } + protected ArrayListTimestampMonitor(HighAccuracyClock clock, String name, int maxRetry, long cleanupThreshold) { + super(); + this.clock = clock; + this.name = name; + this.maxRetry = maxRetry; + this.cleanupThreshold = cleanupThreshold; + } + + public ArrayListTimestampMonitor() { + this(new HighAccuracyClock(), "TimestampMonitor", 100, 1000000000L); + } + + public ArrayListTimestampMonitor(HighAccuracyClock clock, String name) { + this(clock, name, 100, 1000000000L); + } + + private volatile long prev = System.nanoTime(); + + public boolean recordPacket(K key, int length) { + return recordPacket(key, clock.getCurrentTimeNanos(), length); + } + + /** + * 记录数据包 - 使用插入排序保持列表有序,添加时间戳验证 + */ + public boolean recordPacket(K key, Long128 timestamp, int length) { + // 验证时间戳的合理性 + validateTimestamp(timestamp); + + // 快速路径:尝试sequence=0 + TimestampMonitorKey monitorKey = new TimestampMonitorKey<>(key, 0); + TimestampMonitorValue monitorValue = new TimestampMonitorValue(monitorKey, timestamp, length); + autoCleanup(cleanupThreshold); + + rwLock.writeLock().lock(); + try { + // 使用二分查找插入排序,保持列表有序 + insertSorted(monitorValue); + totalDataSize.add(length); + totalPackets.increment(); + return true; + } finally { + rwLock.writeLock().unlock(); + } + } + + /** + * 验证时间戳的合理性 + */ + private void validateTimestamp(Long128 timestamp) { + /* BigInteger currentTime = clock.getCurrentTimeNanos(); + BigInteger maxAllowedTime = currentTime.add(BigInteger.valueOf(TIMESTAMP_TOLERANCE_NS)); + + if (timestamp.compareTo(maxAllowedTime) > 0) { + throw new IllegalArgumentException( + String.format("Timestamp %s is in the future (current time: %s, tolerance: %d ns)", + timestamp, currentTime, TIMESTAMP_TOLERANCE_NS)); + } + + */ + } + + /** + * 使用二分查找进行插入排序,保持列表有序 + */ + private void insertSorted(TimestampMonitorValue newValue) { + if (entries.isEmpty()) { + entries.add(newValue); + return; + } + + // 优化:检查是否可以快速添加到末尾(大部分数据包是按时间顺序到达的) + TimestampMonitorValue lastValue = entries.get(entries.size() - 1); + if (newValue.getTimestamp().compareTo(lastValue.getTimestamp()) >= 0) { + entries.add(newValue); + return; + } + + // 使用二分查找找到插入位置 + int insertIndex = findInsertIndex(newValue.getTimestamp()); + entries.add(insertIndex, newValue); + } + + /** + * 使用二分查找找到插入位置 + */ + private int findInsertIndex(Long128 timestamp) { + int low = 0; + int high = entries.size() - 1; + + while (low <= high) { + int mid = (low + high) >>> 1; + Long128 midTimestamp = entries.get(mid).getTimestamp(); + int cmp = timestamp.compareTo(midTimestamp); + + if (cmp < 0) { + high = mid - 1; + } else if (cmp > 0) { + low = mid + 1; + } else { + // 时间戳相等,插入到相同时间戳的后面 + return findLastEqualIndex(mid, timestamp) + 1; + } + } + + return low; + } + + /** + * 找到相同时间戳的最后一个元素的索引 + */ + private int findLastEqualIndex(int startIndex, Long128 timestamp) { + int index = startIndex; + while (index < entries.size() - 1 && + entries.get(index + 1).getTimestamp().equals(timestamp)) { + index++; + } + return index; + } + + private void autoCleanup(long th) { + long curr = System.nanoTime(); + if (curr - prev > th) { + prev = curr; + cleanup(); + } + } + + public void cleanup() { + cleanup(clock.getCurrentTimeNanos(), cleanupThreshold); + } + + /** + * 清理旧记录 - 由于列表已排序,直接使用二分查找 + */ + public void cleanup(Long128 currentTime, long timeWindowNs) { + Long128 startTime = currentTime.subtract(Long128.valueOf(timeWindowNs)); + + rwLock.writeLock().lock(); + try { + // 使用二分查找找到第一个不过期的元素位置 + int firstValidIndex = findFirstValidIndex(startTime); + + if (firstValidIndex > 0) { + // 删除所有过期的元素 + entries.subList(0, firstValidIndex).clear(); + } + } finally { + rwLock.writeLock().unlock(); + } + prev=System.nanoTime(); + } + + /** + * 使用二分查找找到第一个时间戳 >= startTime 的元素索引 + */ + private int findFirstValidIndex(Long128 startTime) { + int low = 0; + int high = entries.size(); + + while (low < high) { + int mid = (low + high) >>> 1; + Long128 midTimestamp = entries.get(mid).getTimestamp(); + + if (midTimestamp.compareTo(startTime) < 0) { + low = mid + 1; + } else { + high = mid; + } + } + + return low; + } + + public long calculateDataVolume(long timeWindowNs) { + return calculateDataVolume(clock.getCurrentTimeNanos(), timeWindowNs); + } + + /** + * 高性能数据量计算 - 优化:由于数据包不会来自未来,只需要查找startTime + */ + public long calculateDataVolume(Long128 currentTime, long timeWindowNs) { + Long128 startTime = currentTime.subtract(Long128.valueOf(timeWindowNs)); + + rwLock.readLock().lock(); + try { + return calculateDataVolumeFromSortedList(entries, startTime); + } finally { + rwLock.readLock().unlock(); + } + } + + /** + * 从已排序的列表中计算数据量 - 优化版本,只需要startTime + */ + private long calculateDataVolumeFromSortedList(List sortedList, + Long128 startTime) { + if (sortedList.isEmpty()) { + return 0; + } + + // 使用二分查找找到第一个 >= startTime 的元素位置 + int startIndex = findFirstValidIndexFromSorted(sortedList, startTime); + + if (startIndex >= sortedList.size()) { + return 0; + } + + // 计算从startIndex到末尾的所有数据量(因为数据包不会来自未来) + long sum = 0; + for (int i = startIndex; i < sortedList.size(); i++) { + sum += sortedList.get(i).getLength(); + } + + return sum; + } + + /** + * 在已排序列表中找到第一个时间戳 >= startTime 的索引 + */ + private int findFirstValidIndexFromSorted(List sortedList, Long128 startTime) { + int low = 0; + int high = sortedList.size(); + + while (low < high) { + int mid = (low + high) >>> 1; + Long128 midTimestamp = sortedList.get(mid).getTimestamp(); + + if (midTimestamp.compareTo(startTime) < 0) { + low = mid + 1; + } else { + high = mid; + } + } + + return low; + } + + public long calculatePacketCount(long timeWindowNs) { + return calculatePacketCount(clock.getCurrentTimeNanos(), timeWindowNs); + } + + /** + * 高性能包数计算 - 优化:由于数据包不会来自未来,只需要查找startTime + */ + public long calculatePacketCount(Long128 currentTime, long timeWindowNs) { + Long128 startTime = currentTime.subtract(Long128.valueOf(timeWindowNs)); + + rwLock.readLock().lock(); + try { + return calculatePacketCountFromSortedList(entries, startTime); + } finally { + rwLock.readLock().unlock(); + } + } + + /** + * 从已排序的列表中计算包数 - 优化版本,只需要startTime + */ + private long calculatePacketCountFromSortedList(List sortedList, + Long128 startTime) { + if (sortedList.isEmpty()) { + return 0; + } + + int startIndex = findFirstValidIndexFromSorted(sortedList, startTime); + + if (startIndex >= sortedList.size()) { + return 0; + } + + // 计算从startIndex到末尾的所有包数(因为数据包不会来自未来) + return sortedList.size() - startIndex; + } + + public long calculateBandwidth(long timeWindowNs) { + return calculateBandwidth(clock.getCurrentTimeNanos(), timeWindowNs); + } + + /** + * 计算带宽 + */ + public long calculateBandwidth(Long128 currentTime, long timeWindowNs) { + if (timeWindowNs <= 0) { + return 0; + } + + long dataVolume = calculateDataVolume(currentTime, timeWindowNs); + return (long) (dataVolume * 1000000000.0 / timeWindowNs); + } + + public TrafficStats calculateTrafficStats(long timeWindowNs) { + return calculateTrafficStats(clock.getCurrentTimeNanos(), timeWindowNs); + } + + /** + * 计算流量统计信息 - 优化:由于数据包不会来自未来,只需要查找startTime + */ + public TrafficStats calculateTrafficStats(Long128 currentTime, long timeWindowNs) { + Long128 startTime = currentTime.subtract(Long128.valueOf(timeWindowNs)); + + rwLock.readLock().lock(); + try { + return calculateTrafficStatsFromSortedList(entries, startTime, currentTime, timeWindowNs); + } finally { + rwLock.readLock().unlock(); + } + } + + /** + * 从已排序的列表中计算流量统计 - 优化版本 + */ + private TrafficStats calculateTrafficStatsFromSortedList(List sortedList, + Long128 startTime, Long128 currentTime, + long timeWindowNs) { + TrafficStats stats = new TrafficStats(); + stats.timeWindowNs = timeWindowNs; + stats.currentTime = currentTime; + + if (sortedList.isEmpty()) { + return stats; + } + + int startIndex = findFirstValidIndexFromSorted(sortedList, startTime); + + if (startIndex >= sortedList.size()) { + return stats; + } + + // 计算从startIndex到末尾的所有数据(因为数据包不会来自未来) + for (int i = startIndex; i < sortedList.size(); i++) { + TimestampMonitorValue value = sortedList.get(i); + stats.packetCount++; + stats.totalBytes += value.getLength(); + + if (stats.earliestTimestamp.equals(BigInteger.ZERO) || + value.getTimestamp().compareTo(stats.earliestTimestamp) < 0) { + stats.earliestTimestamp = value.getTimestamp(); + } + if (value.getTimestamp().compareTo(stats.latestTimestamp) > 0) { + stats.latestTimestamp = value.getTimestamp(); + } + } + + return stats; + } + + + // Getters + public long getTotalDataSize() { return totalDataSize.sum(); } + public long getTotalPackets() { return totalPackets.sum(); } + public int getEntryCount() { + rwLock.readLock().lock(); + try { + return entries.size(); + } finally { + rwLock.readLock().unlock(); + } + } + + public void reset() { + rwLock.writeLock().lock(); + try { + totalDataSize.reset(); + totalPackets.reset(); + entries.clear(); + } finally { + rwLock.writeLock().unlock(); + } + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(name); + sb.append('\n'); + sb.append(KLALBUtils.convertIBUint(totalDataSize.sum())).append("\t") + .append(KLALBUtils.convertIBUint(calculateBandwidth(Math.min(cleanupThreshold,1000000000L)))).append("/s\t"); + return sb.toString(); + } + + public static void main(String[] args) throws InterruptedException { + AtomicLong along=new AtomicLong(0); + ArrayListTimestampMonitor monitor = new ArrayListTimestampMonitor<>(new HighAccuracyClock(),"Monitor",100,200000000L); + Thread t=new Thread(()->{ + while(true) { + monitor.recordPacket(along.getAndIncrement(), 1000); + } + }); + t.start(); + Timer tx=new Timer(); + tx.scheduleAtFixedRate(new TimerTask() { + + @Override + public void run() { + // 计算带宽 + long testEndTime = System.nanoTime(); + monitor.cleanup(); + // 计算统计信息 + // TrafficStats stats = monitor.calculateTrafficStats(1000000000L); + System.out.println(monitor); + System.out.println(KLALBUtils.convertUintNanoDefalut( System.nanoTime()-testEndTime)); + } + }, 100, 100); + + + + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/monitor/HashMapTimestampMonitor.java b/src/org/kne/cloud/network/monitor/HashMapTimestampMonitor.java new file mode 100644 index 0000000..8997cd0 --- /dev/null +++ b/src/org/kne/cloud/network/monitor/HashMapTimestampMonitor.java @@ -0,0 +1,275 @@ +package org.kne.cloud.network.monitor; + +import java.math.BigInteger; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; +import java.util.stream.Collectors; + +import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.cloud.network.klalb.KLALBUtils; +import org.kne.math.Long128; + +public class HashMapTimestampMonitor implements TimestampMonitor { + + + private HighAccuracyClock clock; + +private String name; + + + // 使用LongAdder替代AtomicLong,在高并发下性能更好 + private final LongAdder totalDataSize = new LongAdder(); + private final LongAdder totalPackets = new LongAdder(); + + // 配置参数 + private final int maxRetry; + private final long cleanupThreshold; + + + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public HighAccuracyClock getClock() { + return clock; + } + protected HashMapTimestampMonitor(HighAccuracyClock clock,String name, int maxRetry, long cleanupThreshold) { + super(); + this.clock=clock; + this.name = name; + this.maxRetry = maxRetry; + this.cleanupThreshold = cleanupThreshold; + } +public HashMapTimestampMonitor() { + this(new HighAccuracyClock(),"TimestampMonitor",100, 1000000000L); // 默认最大重试100次,清理阈值1秒 + } + + public HashMapTimestampMonitor(HighAccuracyClock clock,String name) { + this(clock,name,100, 1000000000L); // 默认最大重试100次,清理阈值1秒 + } + private final ConcurrentHashMap, TimestampMonitorValue> entries = + new ConcurrentHashMap<>(); + + private volatile long prev=System.nanoTime(); + + + public boolean recordPacket(K key, int length) { + return recordPacket(key,clock.getCurrentTimeNanos(),length); + } + /** + * 超高性能记录数据包 - 针对路由器优化 + */ + public boolean recordPacket(K key, Long128 timestamp, int length) { + autoCleanup(cleanupThreshold); + // 快速路径:尝试sequence=0 + TimestampMonitorKey monitorKey = new TimestampMonitorKey<>(key, 0); + TimestampMonitorValue monitorValue = new TimestampMonitorValue(monitorKey,timestamp, length); + + if (entries.putIfAbsent(monitorKey, monitorValue) == null) { + totalDataSize.add(length); + totalPackets.increment(); + return true; + } + + // 重试路径(极少执行) + for (int sequence = 0; sequence < maxRetry; sequence++) { + monitorKey = new TimestampMonitorKey<>(key, sequence); + monitorValue = new TimestampMonitorValue(monitorKey,timestamp, length); + if (entries.putIfAbsent(monitorKey, monitorValue) == null) { + totalDataSize.add(length); + totalPackets.increment(); + return true; + } + } + + return false; + } + + private void autoCleanup(long th) { + long curr=System.nanoTime(); + if(curr-prev>th) { + prev=curr; + cleanup(); + } + } + public void cleanup() { + cleanup(clock.getCurrentTimeNanos(),cleanupThreshold); + } + + /** + *清理旧记录 + */ + public void cleanup(Long128 currentTime, long timeWindowNs) { + Long128 startTime = currentTime .subtract(Long128.valueOf( timeWindowNs)); + //System.out.println("clr"); + entries.entrySet().removeIf(entry -> + entry.getValue().getTimestamp() .compareTo( startTime)<0); + prev=System.nanoTime(); + } + /*public void cleanup(Long128 currentTime, long timeWindowNs) { + Long128 startTime = currentTime.subtract(Long128.valueOf(timeWindowNs)); + + // 并行筛选需要删除的键 + List keysToRemove = entries.entrySet() + .parallelStream() + .filter(entry -> entry.getValue().getTimestamp().compareTo(startTime) < 0) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + // 批量删除(如果entries是ConcurrentHashMap,可以并行删除) + keysToRemove.parallelStream().forEach(entries::remove); + System.out.println("remove:"+keysToRemove.size()); + prev=System.nanoTime(); + }*/ + + public long calculateDataVolume(long timeWindowNs) { + return calculateDataVolume(clock.getCurrentTimeNanos(),timeWindowNs); + } + + /** + * 高性能数据量计算 - 使用并行流 + */ + public long calculateDataVolume(Long128 currentTime, long timeWindowNs) { + Long128 startTime = currentTime .subtract(Long128.valueOf( timeWindowNs)); + + return entries.values().stream() + .filter(value -> (value.getTimestamp() .compareTo( startTime )>=0)&& + (value.getTimestamp().compareTo( currentTime) <=0) ) + .mapToLong(TimestampMonitorValue::getLength) + .sum(); + } + + public long calculatePacketCount(long timeWindowNs) { + return calculatePacketCount(clock.getCurrentTimeNanos(),timeWindowNs); + } + + /** + * 高性能包数计算 - 使用并行流 + * 计算从n纳秒前到现在的时间窗口内传输的数据包数量 + */ + public long calculatePacketCount(Long128 currentTime, long timeWindowNs) { + Long128 startTime = currentTime .subtract(Long128.valueOf( timeWindowNs)); + + return entries.values().parallelStream() + .filter(value -> (value.getTimestamp() .compareTo( startTime )>=0)&& + (value.getTimestamp().compareTo( currentTime) <=0) ) + .count(); + } + + public long calculateBandwidth(long timeWindowNs) { + return calculateBandwidth(clock.getCurrentTimeNanos(),timeWindowNs); + } + + /** + * 计算带宽 - 添加单位转换 + */ + public long calculateBandwidth(Long128 currentTime, long timeWindowNs) { + if (timeWindowNs <= 0) { + return 0; + } + + long dataVolume = calculateDataVolume(currentTime, timeWindowNs); + // System.out.println(dataVolume); + return (long) (dataVolume*1000000000.0/timeWindowNs); + } + + public TrafficStats calculateTrafficStats(long timeWindowNs) { + return calculateTrafficStats(clock.getCurrentTimeNanos(),timeWindowNs); + } + /** + * 计算包数并同时获取带宽信息 + */ + public TrafficStats calculateTrafficStats(Long128 currentTime, long timeWindowNs) { + Long128 startTime = currentTime .subtract(Long128.valueOf( timeWindowNs)); + + TrafficStats stats = entries.values().parallelStream() + .filter(value -> (value.getTimestamp() .compareTo( startTime )>=0)&& + (value.getTimestamp().compareTo( currentTime) <=0) ) + .collect( + TrafficStats::new, + (ts, value) -> { + ts.packetCount++; + ts.totalBytes += value.getLength(); + if (ts.earliestTimestamp .equals(Long128.ZERO) || (value.getTimestamp() .compareTo( ts.earliestTimestamp)<0)) { + ts.earliestTimestamp = value.getTimestamp(); + } + if (value.getTimestamp() .compareTo( ts.latestTimestamp)>0) { + ts.latestTimestamp = value.getTimestamp(); + } + }, + (ts1, ts2) -> { + ts1.packetCount += ts2.packetCount; + ts1.totalBytes += ts2.totalBytes; + ts1.earliestTimestamp = ts1.earliestTimestamp.min( ts2.earliestTimestamp); + ts1.latestTimestamp = ts1.latestTimestamp.max( ts2.latestTimestamp); + } + ); + + stats.timeWindowNs = timeWindowNs; + stats.currentTime = currentTime; + return stats; + } + + + // Getters + public long getTotalDataSize() { return totalDataSize.sum(); } + public long getTotalPackets() { return totalPackets.sum(); } + public int getEntryCount() { return entries.size(); } + + + public void reset() { + totalDataSize.reset(); + totalPackets.reset(); + entries.clear(); + } + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(name); + sb.append('\n'); + sb.append(KLALBUtils.convertIBUint(totalDataSize.sum())).append("\t") + .append(KLALBUtils.convertIBUint(calculateBandwidth(Math.min(cleanupThreshold,1000000000L)))).append("/s\t"); + return sb.toString(); + } + public static void main(String[] args) throws InterruptedException { + HighAccuracyClock clk=new HighAccuracyClock(); + HashMapTimestampMonitor monitor = new HashMapTimestampMonitor<>(clk,"Monitor",100,200000000L); + Thread t=new Thread(()->{ + long l=0; + while(true) { + monitor.recordPacket(l++, 1000); + } + }); + t.start(); + Timer tx=new Timer(); + tx.scheduleAtFixedRate(new TimerTask() { + + @Override + public void run() { + // 计算带宽 + long testEndTime = System.nanoTime(); + monitor.cleanup(); + // 计算统计信息 + // TrafficStats stats = monitor.calculateTrafficStats(1000000000L); + System.out.println(monitor); + System.out.println(KLALBUtils.convertUintNanoDefalut( System.nanoTime()-testEndTime)+monitor.entries.size()); + } + }, 100, 100); + + + + } + + +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/monitor/MonitorDataImpl.java b/src/org/kne/cloud/network/monitor/MonitorDataImpl.java index 53331f7..cc5c56d 100644 --- a/src/org/kne/cloud/network/monitor/MonitorDataImpl.java +++ b/src/org/kne/cloud/network/monitor/MonitorDataImpl.java @@ -1,7 +1,5 @@ package org.kne.cloud.network.monitor; -import static org.kne.cloud.network.klalb.KLALBUtils.bytesUnit; - import java.util.Timer; import java.util.TimerTask; import java.util.function.Consumer; diff --git a/src/org/kne/cloud/network/monitor/NanoTimeSeries.java b/src/org/kne/cloud/network/monitor/NanoTimeSeries.java deleted file mode 100644 index 2f63a33..0000000 --- a/src/org/kne/cloud/network/monitor/NanoTimeSeries.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.kne.cloud.network.monitor; - -public class NanoTimeSeries { - -} diff --git a/src/org/kne/cloud/network/monitor/SpeedAndTrafficAndDelayMonitorDataImpl.java b/src/org/kne/cloud/network/monitor/SpeedAndTrafficAndDelayMonitorDataImpl.java index e8a3294..289d72b 100644 --- a/src/org/kne/cloud/network/monitor/SpeedAndTrafficAndDelayMonitorDataImpl.java +++ b/src/org/kne/cloud/network/monitor/SpeedAndTrafficAndDelayMonitorDataImpl.java @@ -1,24 +1,26 @@ package org.kne.cloud.network.monitor; +import org.kne.cloud.network.klalb.KLALBUtils; + public class SpeedAndTrafficAndDelayMonitorDataImpl extends SpeedAndTrafficMonitorDataImpl implements SpeedAndTrafficMonitorData,DelayMonitorData{ - private volatile long outDelay; + private volatile long outDelay=Long.MAX_VALUE/1024; private volatile long outDelayMin=Long.MAX_VALUE; private volatile long outDelayAvg=Long.MAX_VALUE; private long outDelayOld; private volatile long outJitter; - private volatile long inDelay; + private volatile long inDelay=Long.MAX_VALUE/1024; private volatile long inDelayMin=Long.MAX_VALUE; private volatile long inDelayAvg=Long.MAX_VALUE; private long inDelayOld; private volatile long inJitter; - private volatile long latency; + private volatile long latency=Long.MAX_VALUE/1024; private volatile long latencyMin=Long.MAX_VALUE; private volatile long latencyAvg=Long.MAX_VALUE; private long latencyOld; @@ -170,7 +172,7 @@ public class SpeedAndTrafficAndDelayMonitorDataImpl extends SpeedAndTrafficMonit @Override public String toString() { StringBuilder sb=new StringBuilder(super.toString()); - sb.append(String.format("%.1f", outDelay/1000000.0) ).append("ms").append("\t").append(String.format("%.1f", inDelay/1000000.0) ).append("ms").append("\t").append(String.format("%.1f", outJitter/1000000.0) ).append("ms\t").append(String.format("%.1f", inJitter/1000000.0) ).append("ms\t"); + sb.append(KLALBUtils.convertUintNanoDefalut( outDelay) ).append("s").append("\t").append(KLALBUtils.convertUintNanoDefalut( inDelay) ).append("s").append("\t").append(KLALBUtils.convertUintNanoDefalut( outJitter) ).append("s\t").append(KLALBUtils.convertUintNanoDefalut( inJitter) ).append("s\t"); return sb.toString(); } diff --git a/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorData.java b/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorData.java index 917c355..b2a1e11 100644 --- a/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorData.java +++ b/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorData.java @@ -1,15 +1,16 @@ package org.kne.cloud.network.monitor; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; public interface SpeedAndTrafficMonitorData extends MonitorData{ public long getInTraffic(); public long getOutTraffic(); -public AtomicLong getInTrafficAL(); +public LongAdder getInTrafficAL(); -public AtomicLong getOutTrafficAL(); +public LongAdder getOutTrafficAL(); public long getInSpeed(); @@ -21,9 +22,9 @@ public long getInPPS(); public long getOutPPS(); -public AtomicLong getInPacketCounterAL(); +public LongAdder getInPacketCounterAL(); -public AtomicLong getOutPacketCounterAL(); +public LongAdder getOutPacketCounterAL(); public long getInPacketCounter(); diff --git a/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorDataImpl.java b/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorDataImpl.java index 8cda996..212341e 100644 --- a/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorDataImpl.java +++ b/src/org/kne/cloud/network/monitor/SpeedAndTrafficMonitorDataImpl.java @@ -1,9 +1,10 @@ package org.kne.cloud.network.monitor; -import static org.kne.cloud.network.klalb.KLALBUtils.bytesUnit; - import java.util.TimerTask; import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.LongAdder; + +import org.kne.cloud.network.klalb.KLALBUtils; public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements SpeedAndTrafficMonitorData { @@ -11,8 +12,8 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S private long updatetime1=System.nanoTime(); private long updatetime2=System.nanoTime(); - private volatile AtomicLong inTraffic=new AtomicLong(); - private volatile AtomicLong outTraffic=new AtomicLong(); + private volatile LongAdder inTraffic=new LongAdder(); + private volatile LongAdder outTraffic=new LongAdder(); private long inTrafficOld=0; @@ -43,7 +44,7 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S } protected void createTask() { - getTimer().scheduleAtFixedRate(tmt, 0, 50); + getTimer().scheduleAtFixedRate(tmt, 0, 20); } protected void createTask1() { @@ -61,18 +62,18 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S } public long getInTraffic() { - return inTraffic.get(); + return inTraffic.sum(); } public long getOutTraffic() { - return outTraffic.get(); + return outTraffic.sum(); } - public AtomicLong getInTrafficAL() { + public LongAdder getInTrafficAL() { return inTraffic; } - public AtomicLong getOutTrafficAL() { + public LongAdder getOutTrafficAL() { return outTraffic; } @@ -121,25 +122,29 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S long d=System.nanoTime()-updatetime; if(d!=0) { if(inTraffic!=null) { - long i=inTraffic.get()-inTrafficOld; - inTrafficOld =inTraffic.get(); + long inTrafficSum=inTraffic.sum(); + long i=inTrafficSum-inTrafficOld; + inTrafficOld =inTrafficSum; inSpeed= (long) (i*1000000000.0/d); } if(outTraffic!=null) { - long o=outTraffic.get()-outTrafficOld; - outTrafficOld =outTraffic.get(); + long outTrafficSum=outTraffic.sum(); + long o=outTrafficSum-outTrafficOld; + outTrafficOld =outTrafficSum; outSpeed= (long) (o*1000000000.0/d); } if(inCounter!=null) { - long i=inCounter.get()-inCounterOld; - inCounterOld =inCounter.get(); + long inCounterSum=inCounter.sum(); + long i=inCounterSum-inCounterOld; + inCounterOld =inCounterSum; inPPS= (long) (i*1000000000.0/d); } if(outCounter!=null) { - long i=outCounter.get()-outCounterOld; - outCounterOld =outCounter.get(); + long outCounterSum=outCounter.sum(); + long i=outCounterSum-outCounterOld; + outCounterOld =outCounterSum; outPPS= (long) (i*1000000000.0/d); } } @@ -180,26 +185,30 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S long d=System.nanoTime()-updatetime1; if(d!=0) { if(inTraffic!=null) { - long i=inTraffic.get()-inTrafficOld1; - inTrafficOld1 =inTraffic.get(); + long inTrafficSum=inTraffic.sum(); + long i=inTrafficSum-inTrafficOld1; + inTrafficOld1 =inTrafficSum; inSpeedAvg= (long) (i*1000000000.0/d); } if(outTraffic!=null) { - long o=outTraffic.get()-outTrafficOld1; - outTrafficOld1 =outTraffic.get(); + long outTrafficSum=outTraffic.sum(); + long o=outTrafficSum-outTrafficOld1; + outTrafficOld1 =outTrafficSum; outSpeedAvg= (long) (o*1000000000.0/d); } if(inCounter!=null) { - long i=inCounter.get()-inCounterOld1; - inCounterOld1 =inCounter.get(); + long inCounterSum=inCounter.sum(); + long i=inCounterSum-inCounterOld1; + inCounterOld1 =inCounterSum; inPPSAvg= (long) (i*1000000000.0/d); } if(outCounter!=null) { - long o=outCounter.get()-outCounterOld1; - outCounterOld1 =outCounter.get(); + long outCounterSum=outCounter.sum(); + long o=outCounterSum-outCounterOld1; + outCounterOld1 =outCounterSum; outPPSAvg= (long) (o*1000000000.0/d); } } @@ -216,28 +225,32 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S long d=System.nanoTime()-updatetime2; if(d!=0) { if(inTraffic!=null) { - long i=inTraffic.get()-inTrafficOld2; - inTrafficOld2 =inTraffic.get(); + long inTrafficSum=inTraffic.sum(); + long i=inTrafficSum-inTrafficOld2; + inTrafficOld2 =inTrafficSum; inSpeedAvg2= (long) (i*1000000000.0/d); } if(outTraffic!=null) { - long o=outTraffic.get()-outTrafficOld2; - outTrafficOld2 =outTraffic.get(); + long outTrafficSum=outTraffic.sum(); + long o=outTrafficSum-outTrafficOld2; + outTrafficOld2 =outTrafficSum; outSpeedAvg2= (long) (o*1000000000.0/d); } if(inCounter!=null) { - long i=inCounter.get()-inCounterOld2; - inCounterOld2 =inCounter.get(); + long inCounterSum=inCounter.sum(); + long i=inCounterSum-inCounterOld2; + inCounterOld2 =inCounterSum; inPPSAvg2= (long) (i*1000000000.0/d); } if(outCounter!=null) { - long o=outCounter.get()-outCounterOld2; - outCounterOld2 =outCounter.get(); + long outCounterSum=outCounter.sum(); + long o=outCounterSum-outCounterOld2; + outCounterOld2 =outCounterSum; outPPSAvg2= (long) (o*1000000000.0/d); } } @@ -275,7 +288,7 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S public String toString() { StringBuilder sb=new StringBuilder(super.toString()); sb.append('\t'); - sb.append(bytesUnit(outTraffic.get())).append("\t").append(bytesUnit(inTraffic.get())).append("\t").append(bytesUnit(outSpeed)).append("/s\t").append(bytesUnit(inSpeed)).append("/s\t"); + sb.append(KLALBUtils. convertIBUint(outTraffic.sum())).append("\t").append(KLALBUtils.convertIBUint(inTraffic.sum())).append("\t").append(KLALBUtils.convertIBUint(outSpeed)).append("/s\t").append(KLALBUtils.convertIBUint(inSpeed)).append("/s\t"); /*if(getState()==OFFLINE) { sb.append((coolingTime-(System.currentTimeMillis()-mls))/1000L); @@ -298,8 +311,8 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S - private volatile AtomicLong inCounter=new AtomicLong(); - private volatile AtomicLong outCounter=new AtomicLong(); + private volatile LongAdder inCounter=new LongAdder(); + private volatile LongAdder outCounter=new LongAdder(); private long inCounterOld; private long outCounterOld; @@ -333,23 +346,23 @@ public class SpeedAndTrafficMonitorDataImpl extends MonitorDataImpl implements S } @Override - public AtomicLong getInPacketCounterAL() { + public LongAdder getInPacketCounterAL() { return inCounter; } @Override - public AtomicLong getOutPacketCounterAL() { + public LongAdder getOutPacketCounterAL() { return outCounter; } @Override public long getInPacketCounter() { - return inCounter.get(); + return inCounter.sum(); } @Override public long getOutPacketCounter() { - return outCounter.get(); + return outCounter.sum(); } public double getOutPPSMax2() { diff --git a/src/org/kne/cloud/network/monitor/TimestampMonitor.java b/src/org/kne/cloud/network/monitor/TimestampMonitor.java new file mode 100644 index 0000000..2d667d0 --- /dev/null +++ b/src/org/kne/cloud/network/monitor/TimestampMonitor.java @@ -0,0 +1,156 @@ +package org.kne.cloud.network.monitor; + +import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.math.Long128; + +/** + * 时间戳监控器接口 + * 提供高性能的数据包监控和流量统计功能 + */ +public interface TimestampMonitor { + + // ==================== 配置相关方法 ==================== + + /** + * 获取监控器名称 + */ + String getName(); + + /** + * 设置监控器名称 + */ + void setName(String name); + + /** + * 获取时钟源 + */ + HighAccuracyClock getClock(); + + // ==================== 数据记录方法 ==================== + + /** + * 记录数据包(使用当前时间) + * @param key 数据包标识 + * @param length 数据包长度 + * @return 是否记录成功 + */ + boolean recordPacket(K key, int length); + + /** + * 记录数据包(使用指定时间戳) + * @param key 数据包标识 + * @param timestamp 时间戳 + * @param length 数据包长度 + * @return 是否记录成功 + */ + boolean recordPacket(K key, Long128 timestamp, int length); + + // ==================== 清理维护方法 ==================== + + /** + * 执行清理操作(使用当前时间) + */ + void cleanup(); + + /** + * 执行清理操作(使用指定时间) + * @param currentTime 当前时间 + * @param timeWindowNs 时间窗口(纳秒) + */ + void cleanup(Long128 currentTime, long timeWindowNs); + + // ==================== 统计查询方法 ==================== + + /** + * 计算数据量(使用当前时间) + * @param timeWindowNs 时间窗口(纳秒) + * @return 数据量(字节) + */ + long calculateDataVolume(long timeWindowNs); + + /** + * 计算数据量(使用指定时间) + * @param currentTime 当前时间 + * @param timeWindowNs 时间窗口(纳秒) + * @return 数据量(字节) + */ + long calculateDataVolume(Long128 currentTime, long timeWindowNs); + + /** + * 计算数据包数量(使用当前时间) + * @param timeWindowNs 时间窗口(纳秒) + * @return 数据包数量 + */ + long calculatePacketCount(long timeWindowNs); + + /** + * 计算数据包数量(使用指定时间) + * @param currentTime 当前时间 + * @param timeWindowNs 时间窗口(纳秒) + * @return 数据包数量 + */ + long calculatePacketCount(Long128 currentTime, long timeWindowNs); + + /** + * 计算带宽(使用当前时间) + * @param timeWindowNs 时间窗口(纳秒) + * @return 带宽(字节/秒) + */ + long calculateBandwidth(long timeWindowNs); + + /** + * 计算带宽(使用指定时间) + * @param currentTime 当前时间 + * @param timeWindowNs 时间窗口(纳秒) + * @return 带宽(字节/秒) + */ + long calculateBandwidth(Long128 currentTime, long timeWindowNs); + + /** + * 计算流量统计信息(使用当前时间) + * @param timeWindowNs 时间窗口(纳秒) + * @return 流量统计信息 + */ + TrafficStats calculateTrafficStats(long timeWindowNs); + + /** + * 计算流量统计信息(使用指定时间) + * @param currentTime 当前时间 + * @param timeWindowNs 时间窗口(纳秒) + * @return 流量统计信息 + */ + TrafficStats calculateTrafficStats(Long128 currentTime, long timeWindowNs); + + // ==================== 全局统计方法 ==================== + + /** + * 获取总数据量(从启动开始) + * @return 总数据量(字节) + */ + long getTotalDataSize(); + + /** + * 获取总数据包数量(从启动开始) + * @return 总数据包数量 + */ + long getTotalPackets(); + + /** + * 获取当前条目数量 + * @return 条目数量 + */ + int getEntryCount(); + + // ==================== 管理控制方法 ==================== + + /** + * 重置监控器(清空所有数据) + */ + void reset(); + + /** + * 获取字符串表示 + * @return 监控器状态字符串 + */ + String toString(); +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/monitor/TimestampMonitorKey.java b/src/org/kne/cloud/network/monitor/TimestampMonitorKey.java new file mode 100644 index 0000000..41f49ee --- /dev/null +++ b/src/org/kne/cloud/network/monitor/TimestampMonitorKey.java @@ -0,0 +1,31 @@ +package org.kne.cloud.network.monitor; + public class TimestampMonitorKey { + private final K key; + private final long sequence; + + public TimestampMonitorKey(K key, long sequence) { + this.key = key; + this.sequence = sequence; + } + + public K getKey() { return key; } + public long getSequence() { return sequence; } + + @Override + public int hashCode() { + return 31 * key.hashCode() + (int) (sequence ^ (sequence >>> 32)); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof TimestampMonitorKey)) return false; + TimestampMonitorKey other = (TimestampMonitorKey) obj; + return key.equals(other.key) && sequence == other.sequence; + } + + @Override + public String toString() { + return "TimestampMonitorKey [key=" + key + ", sequence=" + sequence + "]"; + } + } \ No newline at end of file diff --git a/src/org/kne/cloud/network/monitor/TimestampMonitorValue.java b/src/org/kne/cloud/network/monitor/TimestampMonitorValue.java new file mode 100644 index 0000000..71aa017 --- /dev/null +++ b/src/org/kne/cloud/network/monitor/TimestampMonitorValue.java @@ -0,0 +1,60 @@ +package org.kne.cloud.network.monitor; + +import java.math.BigInteger; + +import org.kne.math.Long128; + +public class TimestampMonitorValue implements Comparable { + private final Long128 timestamp; + private final int length; + private final TimestampMonitorKey key; + + public TimestampMonitorValue(TimestampMonitorKey key, Long128 timestamp, int length) { + this.key = key; + this.timestamp = timestamp; + this.length = length; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + length; + result = prime * result + ((timestamp == null) ? 0 : timestamp.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + TimestampMonitorValue other = (TimestampMonitorValue) obj; + if (length != other.length) + return false; + if (timestamp == null) { + if (other.timestamp != null) + return false; + } else if (!timestamp.equals(other.timestamp)) + return false; + return true; + } + + @Override + public String toString() { + return "TimestampMonitorValue [timestamp=" + timestamp + ", length=" + length + "]"; + } + + public Long128 getTimestamp() { return timestamp; } + public int getLength() { return length; } + public TimestampMonitorKey getKey() { return key; } + + @Override + public int compareTo(TimestampMonitorValue other) { + return this.timestamp.compareTo(other.timestamp); + } + } + \ No newline at end of file diff --git a/src/org/kne/cloud/network/monitor/TrafficStats.java b/src/org/kne/cloud/network/monitor/TrafficStats.java new file mode 100644 index 0000000..3e17f4c --- /dev/null +++ b/src/org/kne/cloud/network/monitor/TrafficStats.java @@ -0,0 +1,46 @@ +package org.kne.cloud.network.monitor; + +import org.kne.math.Long128; + +/** + * 流量统计信息类 + */ + public class TrafficStats { + public long packetCount; + public long totalBytes; + public Long128 earliestTimestamp; + public Long128 latestTimestamp; + public long timeWindowNs; + public Long128 currentTime; + + public TrafficStats() { + this.packetCount = 0; + this.totalBytes = 0; + this.earliestTimestamp =Long128.ZERO; + this.latestTimestamp = Long128.ZERO; + this.timeWindowNs = 0; + this.currentTime = Long128.ZERO; + } + + public long getPacketsPerSecond() { + return (long) (timeWindowNs > 0 ? (packetCount * 1e9) / timeWindowNs : 0.0); + } + + public long getAveragePacketSize() { + return (long) (packetCount > 0 ? (double) totalBytes / packetCount : 0.0); + } + + public long getBandwidth() { + return (long) (timeWindowNs > 0 ? (totalBytes* 1e9) / timeWindowNs : 0.0); + } + + @Override + public String toString() { + return "TrafficStats [packetCount=" + packetCount + ", totalBytes=" + totalBytes + ", timeWindowNs=" + + timeWindowNs + ", getPacketsPerSecond()=" + getPacketsPerSecond() + ", getAveragePacketSize()=" + + getAveragePacketSize() + ", getBandwidth()=" + getBandwidth() + "]"; + } + + + } + \ No newline at end of file diff --git a/src/org/kne/cloud/network/ntp/NTPContext.java b/src/org/kne/cloud/network/ntp/NTPContext.java new file mode 100644 index 0000000..910894e --- /dev/null +++ b/src/org/kne/cloud/network/ntp/NTPContext.java @@ -0,0 +1,429 @@ +package org.kne.cloud.network.ntp; + +import java.io.Closeable; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.InetSocketAddress; +import java.security.Timestamp; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.ReentrantLock; + +import org.fusesource.jansi.io.AnsiOutputStream.ZeroWidthSupplier; +import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.cloud.clock.NTPTimestamps; +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.ntp.NTPv4Protocol.NTPPeer; +import org.kne.math.Long128; + + +public class NTPContext implements Closeable, AutoCloseable { + private HighAccuracyClock clock; + private static final boolean debug = true; + private static final int REQUEST_COUNT = 10; + + private BigInteger systemFrequencyOffset = NTPTimestamps.nanosToNtp128BitTimeInterval(BigInteger.valueOf(5000)); + private BigInteger localPrecision = NTPTimestamps.nanosToNtp128BitTimeInterval(BigInteger.valueOf(1000)); + private static final BigInteger adjustThreshold = BigInteger.valueOf(2000000L); + + private int minStratum = 16; + private volatile PeerInfo currentClock = new PeerInfo(); + + private volatile boolean closed = false; + private Runnable send = new Runnable() { + @Override + public void run() { + while (!closed) { + try { + Map> mlp = new HashMap<>(); + ios.forEach((v) -> { + mlp.put(v, v.getPeersWillSend()); + }); + for (int i = 0; i < REQUEST_COUNT; i++) { + Set>> mlps = mlp.entrySet(); + for (Iterator>> iterator = mlps.iterator(); iterator + .hasNext();) { + Entry> object = iterator.next(); + List val = object.getValue(); + for (NTPPeer perr : val) { + try { + object.getKey().request(perr); + } catch (IOException e) { + if (debug) + e.printStackTrace(); + } + } + + } + + Thread.sleep(100); + } + Thread.sleep(1000); + + if (!mlp.isEmpty()) + mergeAndApply(); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + }; + + public NTPContext(HighAccuracyClock clock) { + this.clock = clock; + Thread ts = new Thread(send); + ts.setName("NTPv4 Send Thread"); + ts.start(); + } + + public void syncToSystem() { + clock.syncToClock(new HighAccuracyClock()); + minStratum = 15; + currentClock.stratum = Math.min(currentClock.stratum, minStratum); + currentClock.leapIndicator = 0; + } + + public int getMinStratum() { + return minStratum; + } + + public void setMinStratum(int minStratum) { + this.minStratum = minStratum; + } + + public int getStratum() { + return currentClock.stratum; + } + + public HighAccuracyClock getClock() { + return clock; + } + + private ConcurrentHashMap> recvmap = new ConcurrentHashMap>(); + + protected void putPacket(NTPv4Packet nv4, MultipurposeSocketAddress inetSocketAddress) { + checkIP(); + List newv = new Vector(); + List oldv = recvmap.putIfAbsent(inetSocketAddress, newv); + if (oldv == null) { + oldv = newv; + } + + synchronized (oldv) { + oldv.add(nv4); + while (oldv.size() > 8) { + oldv.remove(0); + } + } + } + + private void checkIP() { + Set>> ens = recvmap.entrySet(); + for (Iterator>> iterator = ens.iterator(); iterator + .hasNext();) { + Entry> entry = (Entry>) iterator + .next(); + AtomicBoolean ab = new AtomicBoolean(false); + ios.forEach((x) -> { + if (!ab.get()) + if (x.findPeer(entry.getKey()) != null) { + ab.set(true); + return; + } + }); + if (!ab.get()) { + iterator.remove(); + } + } + } + + private class PeerInfo implements Comparable { + private MultipurposeSocketAddress address; + private int leapIndicator = 3; + private int stratum = 16; + private int referenceIdentifier; + private int pollInterval; + private byte precision; + private long rootDelay = Integer.MAX_VALUE; + private long rootDispersion = Integer.MAX_VALUE; + private BigInteger referenceTimestamp = BigInteger.ZERO; + private BigInteger uploadDelay; + private BigInteger downloadDelay; + private BigInteger rtt; + + @Override + public String toString() { + return "PeerInfo [address=" + address + ", leapIndicator=" + leapIndicator + ", stratum=" + stratum + + ", referenceIdentifier=" + referenceIdentifier + ", pollInterval=" + pollInterval + ", precision=" + + precision + ", rootDelay=" + rootDelay + ", rootDispersion=" + rootDispersion + + ", referenceTimestamp=" + referenceTimestamp + ", uploadDelay=" + uploadDelay + ", downloadDelay=" + + downloadDelay + "]"; + } + + private long getRootDistance() { + return rootDelay / 2 + rootDispersion; + } + + @Override + public int compareTo(PeerInfo o) { + return Long.compare(getRootDistance(), o.getRootDistance()); + } + + public BigInteger getCurrentSelfDispersion128() { + BigInteger vk = (clock.getCurrentTimeNTP128().subtract(referenceTimestamp)).multiply(systemFrequencyOffset) + .divide(BigInteger.TWO.pow(64)); + BigInteger vkl; + if (vk.signum() < 0) { + vkl = BigInteger.ZERO; + } else { + vkl = vk; + } + return vkl; + } + + public long getCurrentRootDispersion() { + BigInteger vkl = getCurrentSelfDispersion128().shiftRight(16 + 32); + long rez = rootDispersion + vkl.longValue(); + if (rez > Integer.MAX_VALUE) { + rez = Integer.MAX_VALUE; + } + return rez; + } + + public BigInteger getAdj() { + return NTPTimestamps.ntp128BitToNanosInterval(uploadDelay.subtract(downloadDelay).shiftRight(1)); + } + } + + public void mergeAndApply() { + List peerInfo = mergeResponses(); + selectAndApply(peerInfo); + } + + private AtomicLong prevAdjustTime = new AtomicLong(System.nanoTime()); + private volatile BigInteger deltaRemaining; + private long avgAdj=0; + private void selectAndApply(List peerInfo) { + Collections.sort(peerInfo); + if(debug) + System.out.println(peerInfo); + if (!peerInfo.isEmpty()) { + PeerInfo pix = peerInfo.get(0); + currentClock = pix; + int i; + int m = Math.min(peerInfo.size(), 3); + BigInteger bi = BigInteger.ZERO; + for (i = 0; i < m; i++) { + PeerInfo pi = peerInfo.get(i); + BigInteger adjt = pi.getAdj(); + bi = bi.add(adjt); + } + BigInteger adj = bi.divide(BigInteger.valueOf(i)); + avgAdj=(avgAdj*7+adj.abs().longValue())/8; + BigInteger adjustment; + if (adj.abs().compareTo(adjustThreshold) > 0) { + adjustment = new BigDecimal(adj).multiply(BigDecimal.valueOf(0.5)).toBigInteger(); + } else { + adjustment = new BigDecimal(adj).multiply(BigDecimal.valueOf(0.0625)).toBigInteger(); + if (deltaRemaining != null) { + long curr = System.nanoTime(); + long old = prevAdjustTime.getAndSet(curr); + BigInteger fadj = adjustment.multiply(BigInteger.valueOf(TimeUnit.SECONDS.toNanos(1))) + .divide(BigInteger.valueOf(curr - old)); + BigInteger fadjustment = new BigDecimal(fadj).multiply(BigDecimal.valueOf(0.015625/4)).toBigInteger(); + clock.adjustFrequency(fadjustment.longValue()); + if(debug) + System.out.println("fadj:" + fadjustment + " f:" + clock.getFrequency()); + } + deltaRemaining = adj.subtract(adjustment); + } + clock.adjustClock(Long128.valueOf( adjustment)); + if(debug) + System.out.println("delta:" + adjustment + " deltaRemaining:" + deltaRemaining); + } + } + + private List mergeResponses() { + List peerInfo = new ArrayList(); + Set>> ens = recvmap.entrySet(); + for (Iterator>> iterator = ens.iterator(); iterator + .hasNext();) { + Entry> entry = (Entry>) iterator + .next(); + + List newv = entry.getValue(); + PeerInfo pi = null; + for (NTPv4Packet pack : newv) { + int li = pack.getLeapIndicator(); + if (li == 3) { + continue; + } + int stratum = pack.getStratum(); + if (stratum == 0) { + stratum = 16; + } + int mode = pack.getMode(); + switch (mode) { + case NTPv4Packet.NTP_SERVER: + stratum += 1; + break; + case NTPv4Packet.NTP_SYMMETRIC_PASSIVE: + if (stratum < minStratum) + stratum += 1; + + break; + + } + if (stratum >= 16) { + continue; + } + if (pi == null) { + pi = new PeerInfo(); + pi.address = entry.getKey(); + } + pi.leapIndicator = pack.getLeapIndicator(); + pi.stratum = stratum; + pi.referenceIdentifier = pack.getReferenceIdentifier(); + pi.pollInterval = pack.getPollInterval(); + pi.precision = pack.getPrecision(); + pi.rootDelay = pack.getRootDelay();// (1/65536.0*1000000000) + pi.rootDispersion = pack.getRootDispersion(); + pi.referenceTimestamp = pack.getReferenceTimestamp128(); + BigInteger uploadD = pack.getReceiveTimestamp128().subtract(pack.getOriginateTimestamp128()); + BigInteger downloadD = pack.getDestinationTimestamp128().subtract(pack.getTransmitTimestamp128()); + BigInteger rtt = uploadD.add(downloadD); + if (pi.uploadDelay == null) { + pi.uploadDelay = uploadD; + } else { + if (pi.uploadDelay.compareTo(uploadD) > 0) { + pi.uploadDelay = uploadD; + } + } + if (pi.downloadDelay == null) { + pi.downloadDelay = downloadD; + } else { + if (pi.downloadDelay.compareTo(downloadD) > 0) { + pi.downloadDelay = downloadD; + } + } + if (pi.rtt == null) { + pi.rtt = rtt; + } else { + if (pi.rtt.compareTo(rtt) > 0) { + pi.rtt = rtt; + } + } + } + if (pi != null) { + + long ndl = pi.rootDelay + (pi.rtt).shiftRight(32 + 16).longValue(); + // System.out.println(pi.rtt+" "+pi.rootDelay+" "+ndl); + pi.rootDelay = Math.min(ndl, Integer.MAX_VALUE); + long ndsp = pi.rootDispersion + Math.max(localPrecision.shiftRight(16 + 32).longValue(), 1); + pi.rootDispersion = Math.min(ndsp, Integer.MAX_VALUE); + peerInfo.add(pi); + } + } + return peerInfo; + } + + @Override + public String toString() { + return "NTPContext [clock=" + clock + ", systemFrequencyOffset=" + systemFrequencyOffset + ", minStratum=" + + minStratum + ", leapIndicator=" + currentClock.leapIndicator + ", stratum=" + currentClock.stratum + + ", referenceIdentifier=" + currentClock.referenceIdentifier + ", pollInterval=" + + currentClock.pollInterval + ", localPrecision=" + localPrecision + ", rootDelay=" + + currentClock.rootDelay + ", rootDispersion=" + currentClock.rootDispersion + ", referenceTimestamp=" + + NTPTimestamps.ntp128ToString(currentClock.referenceTimestamp) + "]"; + } + + public BigInteger getSystemFrequencyOffset() { + return systemFrequencyOffset; + } + + public void setSystemFrequencyOffset(BigInteger systemFrequencyOffset) { + this.systemFrequencyOffset = systemFrequencyOffset; + } + + public BigInteger getLocalPrecision() { + return localPrecision; + } + + public void setLocalPrecision(BigInteger localPrecision) { + this.localPrecision = localPrecision; + } + + public int getLeapIndicator() { + return currentClock.leapIndicator; + } + + public int getReferenceIdentifier() { + return currentClock.referenceIdentifier; + } + + public int getPollInterval() { + return currentClock.pollInterval; + } + + public long getRootDelay() { + return currentClock.rootDelay; + } + + public long getRootDispersion() { + return currentClock.rootDispersion; + } + + public BigInteger getReferenceTimestamp() { + return currentClock.referenceTimestamp; + } + + public BigInteger getReferenceTimestamp64() { + return NTPTimestamps.ntp128To64(currentClock.referenceTimestamp); + } + + public BigInteger getCurrentSelfDispersion128() { + + return currentClock.getCurrentSelfDispersion128(); + } + + public long getCurrentRootDispersion() { + + return currentClock.getCurrentRootDispersion(); + } + + private static Set ios = Collections.synchronizedSet(new HashSet<>()); + + public void registerIO(NTPv4Protocol ntPv4Protocol) { + ios.add(ntPv4Protocol); + } + + public void unregisterIO(NTPv4Protocol ntPv4Protocol) { + ios.remove(ntPv4Protocol); + } + + public boolean isClosed() { + return closed; + } + + @Override + public void close() throws IOException { + closed = true; + } + +} diff --git a/src/org/kne/cloud/network/ntp/NTPv4Packet.java b/src/org/kne/cloud/network/ntp/NTPv4Packet.java new file mode 100644 index 0000000..be7a8c7 --- /dev/null +++ b/src/org/kne/cloud/network/ntp/NTPv4Packet.java @@ -0,0 +1,513 @@ +package org.kne.cloud.network.ntp; + +import java.io.IOException; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.util.ArrayList; +import java.util.List; + +import org.kne.cloud.clock.AdjustedNanoClock; +import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.cloud.clock.NTPTimestamps; +import org.kne.cloud.network.NetworkPacket; +import org.kne.io.KNEChannels; + +public class NTPv4Packet extends NetworkPacket { + public static final int NTP_VERSION_NUMBER = 4; + public static final int NTP_DEFAULT_PORT = 123; + + public static final int NTP_SYMMETRIC_ACTIVE = 1; + + public static final int NTP_SYMMETRIC_PASSIVE = 2; + + public static final int NTP_CLIENT = 3; + + public static final int NTP_SERVER = 4; + + + public static final int BASE_HEADER_LENGTH = 48; // 基本头部长度 + public static final int AUTH_FIELD_LENGTH = 20; // 认证字段长度 + private static final BigInteger TWO_POW_64 = BigInteger.TWO.pow(64); + + private ByteBuffer header = NetworkPacket.bufferAllocator.allocate(BASE_HEADER_LENGTH); + private List extensionFields = new ArrayList<>(); + private AuthenticationField authField; + + + private BigInteger destinationTimeStamp; + private HighAccuracyClock clock; + + public NTPv4Packet(HighAccuracyClock clock) { + initializeHeader(); + this.clock=clock; + } + + private void initializeHeader() { + // 设置默认值:版本4,模式3(客户端) + header.put((byte) (0x23)); // LI=0, VN=4, Mode=3 + header.put((byte) 0); // Stratum + header.put((byte) 0); // Poll + header.put((byte) 0); // Precision + + // 根延迟、根分散、参考标识符初始为0 + for (int i = 4; i < 16; i++) { + header.put((byte) 0); + } + + // 时间戳字段初始为0 + for (int i = 16; i < BASE_HEADER_LENGTH; i++) { + header.put((byte) 0); + } + + header.flip(); + } + + @Override + public long getTotalLength() { + long length = BASE_HEADER_LENGTH; + + // 添加扩展字段长度 + for (ExtensionField ext : extensionFields) { + length += ext.getLength(); + } + + // 添加认证字段长度 + if (authField != null) { + length += AUTH_FIELD_LENGTH; + } + + return length; + } + + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + // 写入基本头部 + dto.write(header.slice(0, header.limit())); + + // 写入扩展字段 + for (ExtensionField ext : extensionFields) { + ext.writeToChannel(dto); + } + + // 写入认证字段 + if (authField != null) { + authField.writeToChannel(dto); + } + } + + @Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + destinationTimeStamp=clock.getCurrentTimeNTP128(); + // 读取基本头部 + header.clear().limit(BASE_HEADER_LENGTH); + KNEChannels.readFully(din, header); + header.flip(); + + // 计算剩余长度 + long remaining = length - BASE_HEADER_LENGTH; + + // 读取扩展字段(如果有) + extensionFields.clear(); + while (remaining > 0) { + // 检查是否是认证字段(认证字段有固定格式) + if (remaining >= AUTH_FIELD_LENGTH) { + // 这里简化处理,实际应该根据协议判断 + break; + } + + ExtensionField ext = new ExtensionField(); + ext.readFromChannel(din, remaining); + extensionFields.add(ext); + remaining -= ext.getLength(); + } + + // 读取认证字段(如果有) + if (remaining >= AUTH_FIELD_LENGTH) { + authField = new AuthenticationField(); + authField.readFromChannel(din, AUTH_FIELD_LENGTH); + } + } + + @Override + protected boolean needEndPosition() { + return true; + } + + // ================== NTP 头部字段访问方法 ================== + + public int getLeapIndicator() { + return (header.get(0) & 0xC0) >> 6; + } + + public void setLeapIndicator(int li) { + byte value = header.get(0); + value = (byte) ((value & 0x3F) | ((li & 0x03) << 6)); + header.put(0, value); + } + + public int getVersionNumber() { + return (header.get(0) & 0x38) >> 3; + } + + public void setVersionNumber(int vn) { + byte value = header.get(0); + value = (byte) ((value & 0xC7) | ((vn & 0x07) << 3)); + header.put(0, value); + } + + public int getMode() { + return header.get(0) & 0x07; + } + + public void setMode(int mode) { + byte value = header.get(0); + value = (byte) ((value & 0xF8) | (mode & 0x07)); + header.put(0, value); + } + + public int getStratum() { + return header.get(1) & 0xFF; + } + + public void setStratum(int stratum) { + header.put(1, (byte) stratum); + } + + public int getPollInterval() { + return header.get(2); + } + + public void setPollInterval(int poll) { + header.put(2, (byte) poll); + } + + public byte getPrecision() { + return header.get(3); + } + + public void setPrecision(byte precision) { + header.put(3, precision); + } + + public int getRootDelay() { + return header.getInt(4); + } + + public void setRootDelay(int rootDelay) { + header.putInt(4, rootDelay); + } + + public int getRootDispersion() { + return header.getInt(8); + } + + public void setRootDispersion(int rootDispersion) { + header.putInt(8, rootDispersion); + } + + public int getReferenceIdentifier() { + return header.getInt(12); + } + + public void setReferenceIdentifier(int refId) { + header.putInt(12, refId); + } + + // ================== 时间戳字段访问方法(64位格式) ================== + + /** + * 获取 Reference Timestamp (64位) + */ + public long getReferenceTimestamp() { + return header.getLong(16); + } + + /** + * 设置 Reference Timestamp (64位) + */ + public void setReferenceTimestamp(long timestamp) { + header.putLong(16, timestamp); + } + + /** + * 获取 Originate Timestamp (64位) + */ + public long getOriginateTimestamp() { + return header.getLong(24); + } + + /** + * 设置 Originate Timestamp (64位) + */ + public void setOriginateTimestamp(long timestamp) { + header.putLong(24, timestamp); + } + + /** + * 获取 Receive Timestamp (64位) + */ + public long getReceiveTimestamp() { + return header.getLong(32); + } + + /** + * 设置 Receive Timestamp (64位) + */ + public void setReceiveTimestamp(long timestamp) { + header.putLong(32, timestamp); + } + + /** + * 获取 Transmit Timestamp (64位) + */ + public long getTransmitTimestamp() { + return header.getLong(40); + } + + /** + * 设置 Transmit Timestamp (64位) + */ + public void setTransmitTimestamp(long timestamp) { + header.putLong(40, timestamp); + } + + + + public void setReferenceTimestamp64(BigInteger longValue) { + setReferenceTimestamp(longValue.longValue()); + } + + public void setOriginateTimestamp64(BigInteger originateTimestamp) { + setOriginateTimestamp(originateTimestamp.longValue()); + } + + + public void setReceiveTimestamp64(BigInteger longValue) { + setReceiveTimestamp(longValue.longValue()); + } + + + public void setTransmitTimestamp64(BigInteger longValue) { + setTransmitTimestamp(longValue.longValue()); + } + + public BigInteger getReferenceTimestamp64() { + BigInteger rez=BigInteger.valueOf(getReferenceTimestamp()); + if(rez.signum()<0) { + rez=rez.add(TWO_POW_64); + } + return rez; + } + + public BigInteger getOriginateTimestamp64() { + BigInteger rez=BigInteger.valueOf(getOriginateTimestamp()); + if(rez.signum()<0) { + rez=rez.add(TWO_POW_64); + } + return rez; + } + public BigInteger getReceiveTimestamp64() { + BigInteger rez=BigInteger.valueOf(getReceiveTimestamp()); + if(rez.signum()<0) { + rez=rez.add(TWO_POW_64); + } + return rez; + } + public BigInteger getTransmitTimestamp64() { + BigInteger rez=BigInteger.valueOf(getTransmitTimestamp()); + if(rez.signum()<0) { + rez=rez.add(TWO_POW_64); + } + return rez; + } + + + // ================== 扩展字段方法 ================== + + public List getExtensionFields() { + return extensionFields; + } + + public void addExtensionField(ExtensionField field) { + extensionFields.add(field); + } + + public void clearExtensionFields() { + extensionFields.clear(); + } + + // ================== 认证字段方法 ================== + + public AuthenticationField getAuthField() { + return authField; + } + + public void setAuthField(AuthenticationField authField) { + this.authField = authField; + } + + public boolean hasAuthentication() { + return authField != null; + } + + // ================== 工具方法 ================== + + @Override + public String toString() { + return "NTPv4Packet [getLeapIndicator()=" + getLeapIndicator() + ", getVersionNumber()=" + getVersionNumber() + + ", getMode()=" + getMode() + ", getStratum()=" + getStratum() + ", getPollInterval()=" + + getPollInterval() + ", getPrecision()=" + getPrecision() + ", getRootDelay()=" + getRootDelay() + + ", getRootDispersion()=" + getRootDispersion() + ", getReferenceIdentifier()=" + + getReferenceIdentifier() + ", getReferenceTimestamp()=" +NTPTimestamps.ntp64ToString( getReferenceTimestamp64()) + + ", getOriginateTimestamp()=" + NTPTimestamps.ntp64ToString(getOriginateTimestamp64()) + ", getReceiveTimestamp()=" + + NTPTimestamps.ntp64ToString(getReceiveTimestamp64()) + ", getTransmitTimestamp()=" + NTPTimestamps.ntp64ToString(getTransmitTimestamp64()) + "]"; + } + + + + public BigInteger getDestinationTimestamp128() { + return destinationTimeStamp; + } + + + + + + // ================== 内部类:扩展字段 ================== + + public static class ExtensionField { + private ByteBuffer data; + + public ExtensionField() { + data = NetworkPacket.bufferAllocator.allocate(0); + } + + public ExtensionField(byte[] extensionData) { + data = NetworkPacket.bufferAllocator.allocate(extensionData.length); + data.put(extensionData); + data.flip(); + } + + public long getLength() { + return data.limit() + 4; // 数据长度 + 长度字段(4字节) + } + + public void writeToChannel(WritableByteChannel dto) throws IOException { + // 写入长度字段 + ByteBuffer lengthBuffer = NetworkPacket.bufferAllocator.allocate(4); + lengthBuffer.putInt(data.limit()); + lengthBuffer.flip(); + dto.write(lengthBuffer); + + // 写入数据 + dto.write(data.slice(0, data.limit())); + } + + public void readFromChannel(ReadableByteChannel din, long maxLength) throws IOException { + // 读取长度字段 + ByteBuffer lengthBuffer = NetworkPacket.bufferAllocator.allocate(4); + KNEChannels.readFully(din, lengthBuffer); + lengthBuffer.flip(); + int length = lengthBuffer.getInt(); + + // 读取数据 + if (length > 0 && length <= maxLength - 4) { + data = NetworkPacket.bufferAllocator.allocate(length); + KNEChannels.readFully(din, data); + data.flip(); + } + } + + public ByteBuffer getData() { + return data; + } + + public void setData(ByteBuffer data) { + this.data = data; + } + } + + // ================== 内部类:认证字段 ================== + + public static class AuthenticationField extends NetworkPacket{ + private int keyIdentifier; + private ByteBuffer digest; + + public AuthenticationField() { + digest = NetworkPacket.bufferAllocator.allocate(16); // MD5摘要长度 + } + + public long getTotalLength() { + return AUTH_FIELD_LENGTH; // 固定20字节 + } + + public void writeToChannel(WritableByteChannel dto) throws IOException { + ByteBuffer buffer = NetworkPacket.bufferAllocator.allocate(AUTH_FIELD_LENGTH); + buffer.putInt(keyIdentifier); + + ByteBuffer digestCopy = digest.duplicate(); + digestCopy.position(0); + while (digestCopy.hasRemaining()) { + buffer.put(digestCopy.get()); + } + + buffer.flip(); + dto.write(buffer); + } + + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + ByteBuffer buffer = NetworkPacket.bufferAllocator.allocate(AUTH_FIELD_LENGTH); + KNEChannels.readFully(din, buffer); + buffer.flip(); + + keyIdentifier = buffer.getInt(); + + digest = NetworkPacket.bufferAllocator.allocate(16); + while (buffer.hasRemaining() && digest.hasRemaining()) { + digest.put(buffer.get()); + } + digest.flip(); + } + + public int getKeyIdentifier() { + return keyIdentifier; + } + + public void setKeyIdentifier(int keyIdentifier) { + this.keyIdentifier = keyIdentifier; + } + + public ByteBuffer getDigest() { + return digest; + } + + public void setDigest(ByteBuffer digest) { + this.digest = digest; + } + + @Override + protected boolean needEndPosition() { + return true; + } + } + + public BigInteger getReceiveTimestamp128() { + return NTPTimestamps.inferNtp64To128(getReceiveTimestamp64(),clock.getCurrentTimeNTP128()); + } + + public BigInteger getOriginateTimestamp128() { + return NTPTimestamps.inferNtp64To128(getOriginateTimestamp64(),clock.getCurrentTimeNTP128()); + } + + public BigInteger getTransmitTimestamp128() { + return NTPTimestamps.inferNtp64To128(getTransmitTimestamp64(),clock.getCurrentTimeNTP128()); + } + + public BigInteger getReferenceTimestamp128() { + return NTPTimestamps.inferNtp64To128(getReferenceTimestamp64(),clock.getCurrentTimeNTP128()); + } + + +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/ntp/NTPv4Protocol.java b/src/org/kne/cloud/network/ntp/NTPv4Protocol.java new file mode 100644 index 0000000..4524f73 --- /dev/null +++ b/src/org/kne/cloud/network/ntp/NTPv4Protocol.java @@ -0,0 +1,408 @@ +package org.kne.cloud.network.ntp; + +import java.io.Closeable; +import java.io.IOException; +import java.math.BigInteger; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.ReentrantLock; + +import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.cloud.clock.NTPTimestamps; +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.io.KNEChannels; + +public class NTPv4Protocol implements Closeable, AutoCloseable { + private static final boolean showPacket = false; + public static final int NTP_DEFAULT_PORT = 123; + private static final long DEFAULT_POLL_INTERVAL = 2000000000L; + private static final long REQUEST_TIMEOUT = 10000000000L; + private static final long EPHEMERAL_TIMEOUT = 60000000000L; + + public static class NTPPeer { + private MultipurposeSocketAddress address; + private boolean isEphemeral;// ephemeral + private volatile long ephemeralUpdateTime = System.nanoTime(); + private volatile long pollInterval = DEFAULT_POLL_INTERVAL; + private volatile long pollUpdateTime = System.nanoTime() - pollInterval; + private volatile int requestMode; + private volatile long peerPollInterval = pollInterval; + + private boolean checkPollInterval() { + long curr = System.nanoTime(); + if (curr - pollUpdateTime > Math.min(peerPollInterval, pollInterval)) { + pollUpdateTime = curr; + return true; + } else { + return false; + } + } + + private boolean checkEphemeralTimeout() { + if (!isEphemeral) { + return false; + } + long curr = System.nanoTime(); + return curr - ephemeralUpdateTime > EPHEMERAL_TIMEOUT; + } + + private void resetEphemeralTimeout() { + ephemeralUpdateTime = System.nanoTime(); + } + + public long getPollInterval() { + return pollInterval; + } + + public void setPollInterval(long pollInterval) { + this.pollInterval = pollInterval; + } + + public NTPPeer(MultipurposeSocketAddress address, int requestMode) { + this(address, requestMode, false); + } + + protected NTPPeer(MultipurposeSocketAddress address, int requestMode, boolean isEphemeral) { + super(); + checkRequestMode(requestMode); + this.address = address; + this.isEphemeral = isEphemeral; + this.requestMode = requestMode; + } + + private void checkRequestMode(int requestMode2) { + if (requestMode2 != NTPv4Packet.NTP_CLIENT && requestMode2 != NTPv4Packet.NTP_SYMMETRIC_ACTIVE) { + throw new IllegalArgumentException( + "request mode must be NTPv4Packet.NTP_CLIEN or NTPv4Packet.NTP_SYMMETRIC_ACTIVE"); + } + } + + public NTPPeer(String hostport, int requestMode) { + this(new MultipurposeSocketAddress(hostport), requestMode); + } + + public MultipurposeSocketAddress getAddress() { + return address; + } + + private boolean isEphemeral() { + return isEphemeral; + } + + @Override + public String toString() { + return "NTPPeer [address=" + address + ", isEphemeral=" + isEphemeral + ", ephemeralUpdateTime=" + + ephemeralUpdateTime + "]"; + } + + @Override + public int hashCode() { + return Objects.hash(address); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + NTPPeer other = (NTPPeer) obj; + return Objects.equals(address, other.address); + } + + private void setPeerPollInterval(long peerPollInterval) { + this.peerPollInterval = peerPollInterval; + } + + } + + private static class CheckListItem { + private NTPPeer peer; + private BigInteger timeStamp; + private long createTime = System.nanoTime(); + + private CheckListItem(BigInteger timeStamp, NTPPeer peer) { + this.timeStamp = timeStamp; + this.peer = peer; + } + + private boolean checkTimeout() { + return System.nanoTime() - createTime > REQUEST_TIMEOUT; + } + } + + private Set peers = Collections.synchronizedSet(new HashSet<>()); + private Set ephemeralPeers = Collections.synchronizedSet(new HashSet<>()); + + private ReentrantLock checkLock = new ReentrantLock(); + private List checkList = new ArrayList<>(); + + private NTPContext context; + private DatagramSocket dgs; + private MultipurposeSocketAddress bind; + + public NTPv4Protocol(NTPContext context) throws UnknownHostException, IOException { + this(context, new MultipurposeSocketAddress("UDP", "::0", NTP_DEFAULT_PORT)); + } + + public NTPv4Protocol(NTPContext context, MultipurposeSocketAddress bind) throws UnknownHostException, IOException { + this.bind = bind; + this.context = context; + dgs = bind.listenDatagramSocket(); + context.registerIO(this); + Thread tr = new Thread(recv); + tr.setName("NTPv4 Receive Thread"); + tr.start(); + } + + private void setNTPInformation(NTPv4Packet nv4, NTPPeer peer) { + if (peer != null) { + long interval = peer.getPollInterval(); + int pi = (int) log(interval / 1000000000L, 2); + nv4.setPollInterval(pi); + } else { + long interval = DEFAULT_POLL_INTERVAL; + int pi = (int) log(interval / 1000000000L, 2); + nv4.setPollInterval(pi); + } + nv4.setVersionNumber(NTPv4Packet.NTP_VERSION_NUMBER); + nv4.setLeapIndicator(context.getLeapIndicator()); + int stratum = context.getStratum(); + if (stratum == 16) { + stratum = 0; + } + nv4.setStratum(stratum); + BigInteger precision = context.getLocalPrecision(); + byte b = (byte) Math.ceil(log(precision.doubleValue() / (Math.pow(2, 64)), 2)); + nv4.setPrecision(b); + nv4.setRootDelay((int) context.getRootDelay()); + nv4.setRootDispersion((int) context.getCurrentRootDispersion()); + nv4.setReferenceTimestamp64(context.getReferenceTimestamp64()); + nv4.setTransmitTimestamp64(context.getClock().getCurrentTimeNTP64()); + } + + private void setNTPInformation(NTPv4Packet nv4, NTPv4Packet request, NTPPeer peer) { + nv4.setOriginateTimestamp(request.getTransmitTimestamp()); + nv4.setReceiveTimestamp64(NTPTimestamps.ntp128To64(request.getDestinationTimestamp128())); + setNTPInformation(nv4, peer); + } + + private static double log(double value, double base) { + + return Math.log(value) / Math.log(base); + + } + + public void request(NTPPeer peer) throws IOException { + NTPv4Packet nv4 = new NTPv4Packet(context.getClock()); + nv4.setMode(peer.requestMode); + setNTPInformation(nv4, peer); + putOriginTimestamp(nv4, peer); + peer.address.getInetAddress(); + sendNTPPacket(nv4, peer.address.getSocketAddress()); + } + + private void putOriginTimestamp(NTPv4Packet nv4, NTPPeer peer) { + checkLock.lock(); + try { + removeTimeoutTimestamp(); + checkList.add(new CheckListItem(nv4.getTransmitTimestamp128(), peer)); + } finally { + checkLock.unlock(); + } + } + + private void removeTimeoutTimestamp() { + for (Iterator iterator = checkList.iterator(); iterator.hasNext();) { + CheckListItem bigInteger = (CheckListItem) iterator.next(); + if (bigInteger.checkTimeout()) { + if (showPacket) + System.out.println("timeout:" + bigInteger.timeStamp); + iterator.remove(); + } + } + } + + private void sendNTPPacket(NTPv4Packet nv4, SocketAddress target) throws IOException { + ByteBuffer bbf = ByteBuffer.allocate(65535); + nv4.writeToChannel(KNEChannels.newWritableChannel(bbf)); + bbf.flip(); + DatagramPacket dp = new DatagramPacket(bbf.array(), bbf.limit()); + dp.setSocketAddress(target); + dgs.send(dp); + if (showPacket) + System.out.println("NTPv4 TX:" + target + " " + nv4); + } + + private NTPPeer checkOriginTimestamp(NTPv4Packet nv4) { + checkLock.lock(); + try { + BigInteger ori = nv4.getOriginateTimestamp128(); + removeTimeoutTimestamp(); + for (Iterator iterator = checkList.iterator(); iterator.hasNext();) { + CheckListItem item = (CheckListItem) iterator.next(); + if (item.timeStamp.equals(ori)) { + iterator.remove(); + return item.peer; + } + } + } finally { + checkLock.unlock(); + } + return null; + } + + NTPPeer findPeer(MultipurposeSocketAddress addr) { + Object[] objs = peers.toArray(); + for (int i = 0; i < objs.length; i++) { + NTPPeer np = (NTPPeer) objs[i]; + if (np.getAddress().equals2(addr)) { + return np; + } + } + objs = ephemeralPeers.toArray(); + for (int i = 0; i < objs.length; i++) { + NTPPeer np = (NTPPeer) objs[i]; + if (np.getAddress().equals2(addr)) { + return np; + } + } + return null; + } + + private Runnable recv = new Runnable() { + @Override + public void run() { + try { + while (!dgs.isClosed()) { + AtomicReference isa = new AtomicReference<>(); + NTPv4Packet nv4 = receiveNTPPacket(isa); + MultipurposeSocketAddress mpsafrom = new MultipurposeSocketAddress(bind.getType(), isa.get()); + switch (nv4.getMode()) { + case NTPv4Packet.NTP_SYMMETRIC_ACTIVE: + NTPv4Packet nv4r = new NTPv4Packet(context.getClock()); + nv4r.setMode(NTPv4Packet.NTP_SYMMETRIC_PASSIVE); + setNTPInformation(nv4r, nv4, findPeer(mpsafrom)); + sendNTPPacket(nv4r, isa.get()); + ephemeralPeers.add(new NTPPeer(mpsafrom, NTPv4Packet.NTP_SYMMETRIC_ACTIVE, true)); + break; + case NTPv4Packet.NTP_SYMMETRIC_PASSIVE: + NTPPeer npr = checkOriginTimestamp(nv4); + if (npr != null) { + npr.resetEphemeralTimeout(); + npr.setPeerPollInterval((1L << nv4.getPollInterval()) * 1000000000); + context.putPacket(nv4, mpsafrom); + } else { + } + break; + case NTPv4Packet.NTP_CLIENT: + NTPv4Packet nv4s = new NTPv4Packet(context.getClock()); + nv4s.setMode(NTPv4Packet.NTP_SERVER); + setNTPInformation(nv4s, nv4, findPeer(mpsafrom)); + sendNTPPacket(nv4s, isa.get()); + break; + case NTPv4Packet.NTP_SERVER: + NTPPeer nprx = checkOriginTimestamp(nv4); + if (nprx != null) { + nprx.resetEphemeralTimeout(); + nprx.setPeerPollInterval((1L << nv4.getPollInterval()) * 1000000000); + context.putPacket(nv4, mpsafrom); + } else { + } + break; + } + + } + } catch (IOException e) { + e.printStackTrace(); + } + + } + + }; + + protected void sendReqPackets() throws IOException { + List sends = getPeersWillSend(); + for (NTPPeer npr : sends) { + request(npr); + } + + } + + protected List getPeersWillSend() { + List sends = new ArrayList<>(); + peers.forEach((pr) -> { + if (pr.checkPollInterval()) { + sends.add(pr); + } + }); + ephemeralPeers.removeIf((pr) -> { + return pr.checkEphemeralTimeout(); + }); + ephemeralPeers.forEach((pr) -> { + if (pr.checkPollInterval()) { + if (!peers.contains(pr)) { + sends.add(pr); + } + } + }); + return sends; + } + + private NTPv4Packet receiveNTPPacket(AtomicReference isa) throws IOException { + ByteBuffer bbf = ByteBuffer.allocate(65535); + DatagramPacket dp = new DatagramPacket(bbf.array(), bbf.limit()); + dgs.receive(dp); + isa.set((InetSocketAddress) dp.getSocketAddress()); + NTPv4Packet nv4 = new NTPv4Packet(context.getClock()); + nv4.readFromChannel(KNEChannels.newReadableChannel(bbf), dp.getLength()); + if (showPacket) + System.out.println("NTPv4 RX:" + isa.get() + " " + nv4); + return nv4; + } + + public Set getPeers() { + return peers; + } + + @Override + public void close() throws IOException { + dgs.close(); + context.unregisterIO(this); + } + + public boolean isClosed() { + return dgs.isClosed(); + } + + public static void main(String[] args) throws IOException, InterruptedException { + HighAccuracyClock hac = new HighAccuracyClock(); + NTPContext context = new NTPContext(hac); + System.out.println(context); + NTPv4Protocol nvc = new NTPv4Protocol(context, new MultipurposeSocketAddress("{UDP}0.0.0.0:123"));// 106.55.184.199 + nvc.getPeers().add(new NTPPeer("{UDP}106.55.184.199:123", NTPv4Packet.NTP_CLIENT)); + nvc.getPeers().add(new NTPPeer("{UDP}time.windows.com:123", NTPv4Packet.NTP_CLIENT)); + nvc.getPeers().add(new NTPPeer("{UDP}127.0.0.1:123", NTPv4Packet.NTP_SYMMETRIC_ACTIVE)); + /* + * for (int i = 0; i < 10000; i++) { Thread.sleep(1000); + * System.out.println(context.getCurrentSelfDispersion128()); + * System.out.println(context); } + */ + } +} diff --git a/src/org/kne/cloud/network/ntp/TestNTP1.java b/src/org/kne/cloud/network/ntp/TestNTP1.java new file mode 100644 index 0000000..6e4429a --- /dev/null +++ b/src/org/kne/cloud/network/ntp/TestNTP1.java @@ -0,0 +1,19 @@ +package org.kne.cloud.network.ntp; + +import java.io.IOException; +import java.net.UnknownHostException; + +import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.ntp.NTPv4Protocol.NTPPeer; + +public class TestNTP1 { + public static void main(String[] args) throws UnknownHostException, IOException { + HighAccuracyClock hac = new HighAccuracyClock(); + NTPContext context = new NTPContext(hac); + context.syncToSystem(); + System.out.println(context); + NTPv4Protocol nvc = new NTPv4Protocol(context, new MultipurposeSocketAddress("{UDP}0.0.0.0:123"));// 106.55.184.199 + //nvc.getPeers().add(new NTPPeer("{UDP}106.55.184.199:123", NTPv4Packet.NTP_CLIENT)); + } +} diff --git a/src/org/kne/cloud/network/ntp/TestNTP2.java b/src/org/kne/cloud/network/ntp/TestNTP2.java new file mode 100644 index 0000000..ad8616a --- /dev/null +++ b/src/org/kne/cloud/network/ntp/TestNTP2.java @@ -0,0 +1,20 @@ +package org.kne.cloud.network.ntp; + +import java.io.IOException; +import java.net.UnknownHostException; + +import org.kne.cloud.clock.HighAccuracyClock; +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.ntp.NTPv4Protocol.NTPPeer; + +public class TestNTP2 { + public static void main(String[] args) throws UnknownHostException, IOException { + HighAccuracyClock hac = new HighAccuracyClock(); + NTPContext context = new NTPContext(hac); + context.syncToSystem(); + System.out.println(context); + NTPv4Protocol nvc = new NTPv4Protocol(context, new MultipurposeSocketAddress("{UDP}0.0.0.0:0"));// 106.55.184.199 + nvc.getPeers().add(new NTPPeer("{UDP}127.0.0.1:123", NTPv4Packet.NTP_SYMMETRIC_ACTIVE)); + + } +} diff --git a/src/org/kne/cloud/network/perf/Kperf.java b/src/org/kne/cloud/network/perf/Kperf.java index c241053..b947e3b 100644 --- a/src/org/kne/cloud/network/perf/Kperf.java +++ b/src/org/kne/cloud/network/perf/Kperf.java @@ -32,7 +32,7 @@ import org.kne.cloud.network.monitor.QueueingMonitorDataImpl; public class Kperf implements Runnable{ - + private KperfReports reports; private ConcurrentLinkedQueue IsendDequeList = new ConcurrentLinkedQueue(); @@ -70,6 +70,18 @@ public class Kperf implements Runnable{ + public KperfReports getReports() { + return reports; + } + public void setReports(KperfReports reports) { + this.reports = reports; + } + + + + + + private SpeedLimiter test = new SpeedLimiter(MIN_SPEED,10000000L); private static long MIN_SPEED=64*1024L; @@ -77,54 +89,72 @@ public class Kperf implements Runnable{ private long congressSpeed = 0; private double loadPercent = 1.01; + + KLALBPacket testPacket=null; + + private long starttime=System.nanoTime(); + long totaltime=1000; + long usedtime=0; //kperf {KLALB_Stream}[2486:1:f189:7589:f1f7:6f5e:b2eb:1]:4564 //kperf {KLALB_Stream}[2486:1::8888]:4564 @Override public void run() { Thread tc = ThreadTool.makeVDaemonThreadIfSupport("测速控制线程", () -> { final int wtimes=5; + totaltime=(20*1000*1+20*1000*4+wtimes*1000*5)*1000000L; + starttime=System.nanoTime(); System.out.println("测速开始!"); try { long startTime; - /*System.out.println("测试1/4:延迟测试"); + System.out.println("测试1/5:延迟测试"); test.setLimitspeed(0); startTime=System.nanoTime(); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 20; i++) { System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0); System.out.printf("上传延迟:%.3fms 下载延迟:%.3fms\n", monitor.getOutDelay()/1000000.0,monitor.getInDelay()/1000000.0); Thread.sleep(1000); + updateUsedTime(); } System.out.printf("上传延迟 最小:%.3fms 平均:%.3fms 抖动:%.3fms\n",monitor.getOutDelayMin()/1000000.0,monitor.getOutDelayAvg()/1000000.0,monitor.getOutJitter()/1000000.0); System.out.printf("下载延迟 最小:%.3fms 平均:%.3fms 抖动:%.3fms\n",monitor.getInDelayMin()/1000000.0,monitor.getInDelayAvg()/1000000.0,monitor.getInJitter()/1000000.0); - + if(reports!=null) { + monitor.setOutDelay(monitor.getOutDelayAvg()); + monitor.setInDelay(monitor.getInDelayAvg()); + } System.out.println("等待时间"+wtimes+"s"); - Thread.sleep(wtimes*1000); + Thread.sleep(wtimes*1000); + -*/ startTime=System.nanoTime(); if(targetAddress!=null) { - System.out.println("测试2/4:下载带宽测试"); + System.out.println("测试2/5:下载带宽测试"); test.setLimitspeed(0); testPacket=new TESTNPacket(60000); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 20; i++) { System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0); - System.out.printf("下载带宽:%s/s\n", KLALBUtils.bytesUnit(monitor.getInSpeedAvg())); + System.out.printf("下载带宽:%s/s\n", KLALBUtils.convertIBUint(monitor.getInSpeedAvg())); Thread.sleep(1000); } - System.out.printf("下载带宽 平均:%s/s 最大:%s/s\n",KLALBUtils.bytesUnit(monitor.getInSpeedAvg2()),KLALBUtils.bytesUnit(monitor.getInSpeedMax2())); + System.out.printf("下载带宽 平均:%s/s 最大:%s/s\n",KLALBUtils.convertIBUint(monitor.getInSpeedAvg2()),KLALBUtils.convertIBUint(monitor.getInSpeedMax2())); + if(reports!=null) { + reports.downloadSpeedFinish(monitor.getInSpeedAvg2()); + } }else { - System.out.println("测试2/4:上传带宽测试"); + System.out.println("测试2/5:上传带宽测试"); test.setLimitspeed(1000L*1024L*1024L*1024L); testPacket=new TESTNPacket(60000); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 20; i++) { System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0); - System.out.printf("上传带宽:%s/s\n", KLALBUtils.bytesUnit(monitor.getOutSpeedAvg())); + System.out.printf("上传带宽:%s/s\n", KLALBUtils.convertIBUint(monitor.getOutSpeedAvg())); Thread.sleep(1000); } - System.out.printf("上传带宽 平均:%s/s 最大:%s/s\n",KLALBUtils.bytesUnit(monitor.getOutSpeedAvg2()),KLALBUtils.bytesUnit(monitor.getOutSpeedMax2())); + System.out.printf("上传带宽 平均:%s/s 最大:%s/s\n",KLALBUtils.convertIBUint(monitor.getOutSpeedAvg2()),KLALBUtils.convertIBUint(monitor.getOutSpeedMax2())); + if(reports!=null) { + reports.uploadSpeedFinish(monitor.getOutSpeedAvg2()); + } } System.out.println("等待时间"+wtimes+"s"); Thread.sleep(wtimes*1000); @@ -133,26 +163,31 @@ public class Kperf implements Runnable{ startTime=System.nanoTime(); if(targetAddress!=null) { - System.out.println("测试3/4:上传带宽测试"); + System.out.println("测试3/5:上传带宽测试"); test.setLimitspeed(1000L*1024L*1024L*1024L); testPacket=new TESTNPacket(60000); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 20; i++) { System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0); - System.out.printf("上传带宽:%s/s\n", KLALBUtils.bytesUnit(monitor.getOutSpeedAvg())); + System.out.printf("上传带宽:%s/s\n", KLALBUtils.convertIBUint(monitor.getOutSpeedAvg())); Thread.sleep(1000); } - System.out.printf("上传带宽 平均:%s/s 最大:%s/s\n",KLALBUtils.bytesUnit(monitor.getOutSpeedAvg2()),KLALBUtils.bytesUnit(monitor.getOutSpeedMax2())); - + System.out.printf("上传带宽 平均:%s/s 最大:%s/s\n",KLALBUtils.convertIBUint(monitor.getOutSpeedAvg2()),KLALBUtils.convertIBUint(monitor.getOutSpeedMax2())); + if(reports!=null) { + reports.uploadSpeedFinish(monitor.getOutSpeedAvg2()); + } }else { - System.out.println("测试3/4:下载带宽测试"); + System.out.println("测试3/5:下载带宽测试"); test.setLimitspeed(0); testPacket=new TESTNPacket(60000); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 20; i++) { System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0); - System.out.printf("下载带宽:%s/s\n", KLALBUtils.bytesUnit(monitor.getInSpeedAvg())); + System.out.printf("下载带宽:%s/s\n", KLALBUtils.convertIBUint(monitor.getInSpeedAvg())); Thread.sleep(1000); } - System.out.printf("下载带宽 平均:%s/s 最大:%s/s\n",KLALBUtils.bytesUnit(monitor.getInSpeedAvg2()),KLALBUtils.bytesUnit(monitor.getInSpeedMax2())); + System.out.printf("下载带宽 平均:%s/s 最大:%s/s\n",KLALBUtils.convertIBUint(monitor.getInSpeedAvg2()),KLALBUtils.convertIBUint(monitor.getInSpeedMax2())); + if(reports!=null) { + reports.downloadSpeedFinish(monitor.getInSpeedAvg2()); + } } System.out.println("等待时间"+wtimes+"s"); @@ -160,59 +195,72 @@ public class Kperf implements Runnable{ startTime=System.nanoTime(); if(targetAddress!=null) { - System.out.println("测试2/4:下载包转发率测试"); + System.out.println("测试4/5:下载包转发率测试"); test.setLimitspeed(0); testPacket=new TEST1Packet(); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 20; i++) { System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0); - System.out.printf("下载包转发率:%sPPS\n", KLALBUtils.defaultUnit(monitor.getInPPS())); + System.out.printf("下载包转发率:%sPPS\n", KLALBUtils.convertUintDefalut(monitor.getInPPS())); Thread.sleep(1000); } + if(reports!=null) { + reports.downloadPPSFinish(monitor.getInPPSAvg()); + } }else { - System.out.println("测试2/4:上传包转发率测试"); + System.out.println("测试4/5:上传包转发率测试"); test.setLimitspeed(1000L*1024L*1024L*1024L); testPacket=new TEST1Packet(); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 20; i++) { System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0); - System.out.printf("上传包转发率:%sPPS\n", KLALBUtils.defaultUnit(monitor.getOutPPS())); + System.out.printf("上传包转发率:%sPPS\n", KLALBUtils.convertUintDefalut(monitor.getOutPPS())); Thread.sleep(1000); } - //System.out.printf("上传带宽 平均:%s/s 最大:%s/s\n",KLALBUtils.bytesUnit(monitor.getOutSpeedAvg2()),KLALBUtils.bytesUnit(monitor.getOutSpeedMax2())); + if(reports!=null) { + reports.uploadPPSFinish(monitor.getOutPPSAvg()); + } } System.out.println("等待时间"+wtimes+"s"); Thread.sleep(wtimes*1000); startTime=System.nanoTime(); if(targetAddress!=null) { - System.out.println("测试3/4:上传包转发率测试"); + System.out.println("测试5/5:上传包转发率测试"); test.setLimitspeed(1000L*1024L*1024L*1024L); testPacket=new TEST1Packet(); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 20; i++) { System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0); - System.out.printf("上传包转发率:%sPPS\n", KLALBUtils.defaultUnit(monitor.getOutPPS())); + System.out.printf("上传包转发率:%sPPS\n", KLALBUtils.convertUintDefalut(monitor.getOutPPS())); Thread.sleep(1000); } - + + if(reports!=null) { + reports.uploadPPSFinish(monitor.getOutPPSAvg()); + } }else { - System.out.println("测试3/4:下载包转发率测试"); + System.out.println("测试5/5:下载包转发率测试"); test.setLimitspeed(0); testPacket=new TEST1Packet(); - for (int i = 0; i < 30; i++) { + for (int i = 0; i < 20; i++) { System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0); - System.out.printf("下载包转发率:%sPPS\n", KLALBUtils.defaultUnit(monitor.getInPPS())); + System.out.printf("下载包转发率:%sPPS\n", KLALBUtils.convertUintDefalut(monitor.getInPPS())); Thread.sleep(1000); } + if(reports!=null) { + reports.downloadPPSFinish(monitor.getInPPSAvg()); + } } System.out.println("等待时间"+wtimes+"s"); Thread.sleep(wtimes*1000); - System.out.println("测速结束!"); } catch (InterruptedException e) { - System.out.println("测速被中断!"); + //System.out.println("测速被中断!"); }finally { close(); + if(reports!=null) + reports.testFinish(); + System.out.println("测速结束!"); } }); try { @@ -233,7 +281,7 @@ public class Kperf implements Runnable{ // TimeDebugger tdb=new TimeDebugger(); // tdb.putTime("start"); if(checkBandwidthReportTime()) { - writePacketToKPL(new BWINFPacket(monitor.getOutSpeedAvg2(), monitor.getInSpeedAvg2())); + writePacketToKPL(new BWINFPacket(monitor.getOutSpeedAvg(), monitor.getInSpeedAvg())); } if (checkPingTimeSleep()) { writePacketToKPL(new PINGPacket(System.nanoTime())); @@ -246,7 +294,7 @@ public class Kperf implements Runnable{ }else { KLALBPacket testp=testPacket; - if (testp!=null&&test.checkTransmit(testp.getLength())) { + if (testp!=null&&test.checkTransmit(testp.getTotalLength())) { writePacketToKPL(testp); @@ -339,8 +387,11 @@ public class Kperf implements Runnable{ //double load = 1 - monitor.getOutDelayMin() / (double) monitor.getOutDelay(); loadPercent =Math.max( 1.2,0.4); } - + LockSupport.unpark(tlock); + updateUsedTime() ; + if(reports!=null) + reports.updateDial(monitor); break; case KLALBPacket.BWINF: BWINFPacket bwi = (BWINFPacket) kpp; @@ -375,6 +426,18 @@ public class Kperf implements Runnable{ tc.interrupt(); } } + private void updateUsedTime() { + usedtime=System.nanoTime()-starttime; + //System.out.println(usedtime+" "+totaltime); + if(reports!=null) + reports.testProcess(usedtime/(double)totaltime); + } + + + + + + private volatile long time = System.nanoTime(); private volatile long pingInterval = 10000000L; private volatile long pingIntervalSleep = 200000000L; @@ -450,17 +513,17 @@ public class Kperf implements Runnable{ } if (packet != null) { packet.putTimePassport("received"); - long length=packet.getLength(); - monitor.getInTrafficAL().addAndGet(length); - monitor.getInPacketCounterAL().incrementAndGet(); + long length=packet.getTotalLength(); + monitor.getInTrafficAL().add(length); + monitor.getInPacketCounterAL().add(1); } return packet; } private void writePacketToKPL(KLALBPacket packet) throws IOException { - long length=packet.getLength(); - monitor.getOutTrafficAL().addAndGet(length); - monitor.getOutPacketCounterAL().incrementAndGet(); + long length=packet.getTotalLength(); + monitor.getOutTrafficAL().add(length); + monitor.getOutPacketCounterAL().add(1); link.writeKLALBPacket(packet); link.flush(); packet.putTimePassport("sended"); diff --git a/src/org/kne/cloud/network/perf/KperfReports.java b/src/org/kne/cloud/network/perf/KperfReports.java new file mode 100644 index 0000000..ba87e45 --- /dev/null +++ b/src/org/kne/cloud/network/perf/KperfReports.java @@ -0,0 +1,15 @@ +package org.kne.cloud.network.perf; + +import org.kne.cloud.network.monitor.QueueingMonitorDataImpl; + +public interface KperfReports { + public void testProcess(double d); + public void testFinish(); + public void updateDial(QueueingMonitorDataImpl mdt); + public void uploadSpeedFinish(long uploadSpeed); + public void downloadSpeedFinish(long downloadSpeed); + public void uploadPPSFinish(long uploadPPS); + public void downloadPPSFinish(long downloadPPS); + public void uploadDelayFinish(long uploadDelay); + public void downloadDelayFinish(long downloadDelay); +} diff --git a/src/org/kne/cloud/network/perf/TEST1Packet.java b/src/org/kne/cloud/network/perf/TEST1Packet.java index 0315b13..4ab50d1 100644 --- a/src/org/kne/cloud/network/perf/TEST1Packet.java +++ b/src/org/kne/cloud/network/perf/TEST1Packet.java @@ -12,7 +12,7 @@ public class TEST1Packet extends KLALBPacket { private static final int HEADER_LENGTH=1; @Override - public long getLength() { + public long getTotalLength() { return HEADER_LENGTH; } diff --git a/src/org/kne/cloud/network/perf/TESTNPacket.java b/src/org/kne/cloud/network/perf/TESTNPacket.java index 252dd8c..a18d94e 100644 --- a/src/org/kne/cloud/network/perf/TESTNPacket.java +++ b/src/org/kne/cloud/network/perf/TESTNPacket.java @@ -10,6 +10,7 @@ import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; +import org.kne.cloud.network.ByteBufferAllocator; import org.kne.cloud.network.NetworkPacket; import org.kne.cloud.network.klalb.KLALBPacket; @@ -19,7 +20,7 @@ public class TESTNPacket extends KLALBPacket { private ByteBuffer dataBuffer;//=NetworkPacket.databufferpool_65535.borrow(); @Override - public long getLength() { + public long getTotalLength() { return HEADER_LENGTH+dataBuffer.limit(); } @@ -27,7 +28,7 @@ public class TESTNPacket extends KLALBPacket { public TESTNPacket(int limit) { super(TESTN,HEADER_LENGTH); //dataBuffer.limit(limit); - dataBuffer=ByteBuffer.allocate(limit); + dataBuffer=NetworkPacket.bufferAllocator.allocate(limit); } @@ -49,9 +50,7 @@ public class TESTNPacket extends KLALBPacket { public void readFromChannel(ReadableByteChannel din) throws IOException { super.readFromChannel(din); int limit=klalbHeader.getChar(1); - //dataBuffer.clear(); - //dataBuffer.limit(limit); - dataBuffer=ByteBuffer.allocate(limit); + dataBuffer=NetworkPacket.bufferAllocator.allocate(limit); while(dataBuffer.hasRemaining()){ if(din.read(dataBuffer)==-1) { throw new EOFException(); diff --git a/src/org/kne/cloud/network/srv6/IPv6SegmentRoutingTLV.java b/src/org/kne/cloud/network/srv6/IPv6SegmentRoutingTLV.java index 42a8f30..9d4c47c 100644 --- a/src/org/kne/cloud/network/srv6/IPv6SegmentRoutingTLV.java +++ b/src/org/kne/cloud/network/srv6/IPv6SegmentRoutingTLV.java @@ -7,68 +7,38 @@ import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import org.kne.cloud.network.NetworkPacket; +import org.kne.cloud.network.ipv6.TLV; import org.kne.cloud.network.klalb.KLALBPacket; -public class IPv6SegmentRoutingTLV extends NetworkPacket { +public class IPv6SegmentRoutingTLV extends TLV { public static final int PAD1=0; public static final int PADN=4; public static final int HMAC=5; public static final int SEQS=7; public static final int ACKSEQS=8; - private int headerLength=2; - - public int getHeaderLength() { - return headerLength; - } - - private boolean isDefault; - - protected volatile ByteBuffer header; - - private ByteBuffer data; public IPv6SegmentRoutingTLV(ByteBuffer header ) { this(header,true); } - public ByteBuffer getData() { - return data; - } + public IPv6SegmentRoutingTLV(ByteBuffer header ,boolean isDefault ) { - super(); - this.header = header; - this.isDefault=isDefault; - if(getType()==PAD1) - headerLength=1; - if(isDefault&&(headerLength>1)) { - data=ByteBuffer.allocate(512); - } + super(header,isDefault); + } public IPv6SegmentRoutingTLV(int type) { this(type,true); } public IPv6SegmentRoutingTLV(int type,boolean isDefault) { - super(); - this.header=ByteBuffer.allocate(2); - this.isDefault=isDefault; - header.put((byte) type); - if(type==PAD1) { - headerLength=1; - } - if(isDefault&&(headerLength>1)) { - data=ByteBuffer.allocate(512); - } + super(type,isDefault); + } - @Override - public long getLength() { - return headerLength+(isDefault?data.limit():0); - } public static IPv6SegmentRoutingTLV readIPv6SegmentRoutingTLVFromChannel(ReadableByteChannel din) throws IOException { - ByteBuffer bbf= ByteBuffer.allocate(2); + ByteBuffer bbf= NetworkPacket.bufferAllocator.allocate(2); bbf.limit(1); while (bbf.hasRemaining()) { if (din.read(bbf) == -1) { @@ -103,65 +73,5 @@ public class IPv6SegmentRoutingTLV extends NetworkPacket { public static void writeIPv6SegmentRoutingTLVToChannel(WritableByteChannel dto,IPv6SegmentRoutingTLV tlv) throws IOException { tlv.writeToChannel(dto); } - @Override - public void writeToChannel(WritableByteChannel dto) throws IOException { - if(isDefault&&(headerLength>1)) { - setDataLength(data.limit()); - } - header.limit(headerLength); - dto.write(header.slice(0,header.limit())); - if(isDefault&&(headerLength>1)) { - dto.write(data.slice(0, data.limit())); - } - } - @Override - public void readFromChannel(ReadableByteChannel din, long length) throws IOException { - header.limit(1); - while (header.hasRemaining()) { - if (din.read(header) == -1) { - throw new EOFException(); - } - } - if(headerLength>1) { - header.limit(2); - while (header.hasRemaining()) { - if (din.read(header) == -1) { - throw new EOFException(); - } - } - } - header.flip(); - - if(isDefault&&(headerLength>1)) { - data.clear(); - data.limit(getDataLength()); - while(data.hasRemaining()){ - if(din.read(data)==-1) { - throw new EOFException(); - } - } - data.flip(); - } - } - - @Override - protected boolean needEndPosition() { - return false; - } - - public int getType() { - return header.get(0)&0xff; - } - public void setType(int type) { - header.put(0,(byte) type); - } - - public int getDataLength() { - return header.get(1)&0xff; - } - - public void setDataLength(int dataLength) { - header.put(1,(byte) dataLength); - } } diff --git a/src/org/kne/cloud/network/srv6/JsonDataPacket.java b/src/org/kne/cloud/network/srv6/JsonDataPacket.java new file mode 100644 index 0000000..88d33b4 --- /dev/null +++ b/src/org/kne/cloud/network/srv6/JsonDataPacket.java @@ -0,0 +1,118 @@ +package org.kne.cloud.network.srv6; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.EOFException; +import java.io.Externalizable; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.io.Serializable; +import java.net.Inet6Address; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Objects; +import java.util.Set; + +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.NetworkPacket; +import org.kne.cloud.network.ipv6.Inet6AddressGroup; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class JsonDataPacket extends KLALBRoutingProtocolPacket implements Serializable{ + + private Object userCallback; + + + public Object getUserCallback() { + return userCallback; + } + + public void setUserCallback(Object userCallback) { + this.userCallback = userCallback; + } + + @Override + protected long getHeaderSize() { + return HEADER_LENGTH; + } + + private String data; + + private static final int HEADER_LENGTH=3; + + private static Gson gson; + static{ + GsonBuilder gb=new GsonBuilder(); + MultipurposeSocketAddress.registerToGsonBuilder(gb); + gson=gb.create(); + } + + public String getData() { + return data; + } + + public KLALBRoutingProtocolJsonData getDecodedData() { + return gson.fromJson(data,KLALBRoutingProtocolJsonData.class ); + } + + public JsonDataPacket(String data) { + super(JSON_DATA); + this.data=data; + } + + public JsonDataPacket(KLALBRoutingProtocolJsonData data) { + this(gson.toJson(data)); + } + + + public JsonDataPacket(ByteBuffer bb) { + super(bb); + } + + + @Override + public String toString() { + return "JsonDATA "+getData(); + } + + + + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + byte[]bta=data.getBytes(Charset.forName("UTF-8")); + getHeader().putChar(1,(char) bta.length); + super.writeToChannel(dto); + dto.write(ByteBuffer.wrap(bta)); + } + + @Override + public void readFromChannel(ReadableByteChannel din) throws IOException { + super.readFromChannel(din); + int lth=getHeader().getChar(1); + byte[]b=new byte[lth]; + ByteBuffer wp= ByteBuffer.wrap(b); + while(wp.hasRemaining()){ + if(din.read(wp)==-1) { + throw new EOFException(); + } + } + data=new String(b, Charset.forName("UTF-8")); + } + + @Override + public long getTotalLength() { + return HEADER_LENGTH+data.getBytes(Charset.forName("UTF-8")).length; + } + + +} diff --git a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocol.java b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocol.java index c401711..19bd7f5 100644 --- a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocol.java +++ b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocol.java @@ -27,8 +27,12 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import org.kne.cloud.network.ByteBufferAllocator; import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.ipv6.Inet6AddressGroup; import org.kne.cloud.network.ipv6.Neighbor; @@ -69,7 +73,7 @@ public class KLALBRoutingProtocol extends Thread{ public static final long HOTSOPT_TIMEOUT = 1000000000; - public static final int HOTSOPT_REPORT_INTERVAL = 50000000; + public static final int HOTSOPT_REPORT_INTERVAL = 1000000; private SRv6Router router; public SRv6Router getRouter() { return router; @@ -83,15 +87,27 @@ public class KLALBRoutingProtocol extends Thread{ private long floodTimer=System.nanoTime(); private long floodTimer2=System.nanoTime(); private long requestTimer=System.nanoTime(); - KLALBVirtualRawSocket ds = null; + private KLALBVirtualRawSocket ds = null; + private ReentrantLock sendLock=new ReentrantLock(); + + private Set>receivers=new CopyOnWriteArraySet>(); + + public void addReceiver(BiConsumer rec) { + receivers.add(rec); + } + + public void removeReceiver(BiConsumer rec) { + receivers.remove(rec); + } + @Override public void run() { Thread.currentThread().setName("KLALB路由协议接收线程"); getSelfRouterInfo(); try{ - ds=new KLALBVirtualRawSocket(router,router.getLocator().getAddress(), DEFAULT_PROTOCOL_NUMBER); + ds=new KLALBVirtualRawSocket(router.getinLoopback(),router.getLocator().getAddress(), DEFAULT_PROTOCOL_NUMBER); new Thread(()->{ - Thread.currentThread().setName("KLALB路由协议接收线程"); + Thread.currentThread().setName("KLALB路由协议发送线程"); while(true) { try { @@ -115,25 +131,29 @@ public class KLALBRoutingProtocol extends Thread{ }*/ long cur=System.nanoTime(); - if(cur-floodTimer>60000000000L) { + if(cur-floodTimer>20000000000L) { if(debug) System.out.println("update60"); floodTimer=cur; - floodPacket(ds, null, new RouterInfoPacket(selfRouterInfo,true,-1)); + floodPacket( null, new RouterInfoPacket(selfRouterInfo,true,-1)); } if(cur-floodTimer2>1000000000L) { if(debug) System.out.println("update1"); floodTimer2=cur; - floodPacket(ds, null, new RouterInfoPacket(selfRouterInfo,true,router.getASN())); + floodPacket(null, new RouterInfoPacket(selfRouterInfo,true,router.getASN())); } //Set requestSet=new HashSet<>(); for (Iterator> iterator = netmap.entrySet().iterator(); iterator.hasNext();) { Entry type = (Entry) iterator.next(); RouterInfo val=type.getValue(); - if(val.checkTimeOut()) { + long timeout=30000000000L; + if(val.getAsn()==router.getASN()) { + timeout=2000000000L; + } + if(val.checkTimeOut(timeout)) { iterator.remove(); noticeUpdate(); } @@ -197,21 +217,20 @@ public class KLALBRoutingProtocol extends Thread{ while(true) { try { - byte[]ca=new byte[65535]; + byte[]ca=ByteBufferAllocator.allocateArray(65535); DatagramPacket dgp=new DatagramPacket(ca, ca.length); ds.receive(dgp); //System.out.println(Arrays.toString( Arrays.copyOf( dgp.getData(),dgp.getLength()))); ByteArrayInputStream bi=new ByteArrayInputStream(dgp.getData(),0,dgp.getLength()); KLALBRoutingProtocolPacket kp=KLALBRoutingProtocolPacket.readKLALBPacketFromChannel(Channels.newChannel(bi)); - //System.out.println(kp); switch(kp.getType()) { case KLALBRoutingProtocolPacket.RINFO_REQ: RouterInfo rifr=netmap.get(router.getLocator().getAddress()); if(debug) System.out.println("get Request from:"+dgp.getSocketAddress()); if(rifr!=null) { - writePacket(ds, new RouterInfoPacket( rifr,false,-1), dgp.getSocketAddress()); + writePacket( new RouterInfoPacket( rifr,false,-1), dgp.getSocketAddress()); if(debug) System.out.println("response router info:"+rifr); }else { @@ -233,7 +252,7 @@ public class KLALBRoutingProtocol extends Thread{ netmap.put(rif.getLocator().getAddress(), rif); noticeUpdate(); if(rifp.isFlood()) { - floodPacket(ds, dgp.getSocketAddress(), rifp); + floodPacket( dgp.getSocketAddress(), rifp); } @@ -244,6 +263,10 @@ public class KLALBRoutingProtocol extends Thread{ } computeShortestPathIfUpdated(); break; + case KLALBRoutingProtocolPacket.JSON_DATA: + JsonDataPacket data=(JsonDataPacket) kp; + receivers.forEach((v)->{v.accept(dgp.getSocketAddress(),data);}); + break; default: break; } @@ -260,43 +283,44 @@ public class KLALBRoutingProtocol extends Thread{ } } - private void floodPacket(KLALBVirtualRawSocket ds2,SocketAddress except,RouterInfoPacket rifp) throws IOException { + private void floodPacket(SocketAddress except,RouterInfoPacket rifp) throws IOException { long asn=rifp.getASN(); - Listlinks=router.getLinkTabel(); - Object[] nls=links.toArray(); - for(int i=0;ineis=nl.getNeighborsInfo(); - for (Iterator iteratorx = neis.iterator(); iteratorx.hasNext();) { - Neighbor addresses = (Neighbor) iteratorx.next(); + Listln= router.getNeighbors(); + for(Neighbor addresses :ln) { + if(addresses.getLocator()==null) + continue; InetSocketAddress isa=new InetSocketAddress(addresses.getLocator().getAddress(),DEFAULT_PORT); if(!isa.equals(except)) { if(asn==-1) { - writePacket(ds2, rifp, isa); + writePacket( rifp, isa); }else{ RouterInfo nif= netmap.get(isa.getAddress()); if(nif!=null&&nif.getAsn()==asn) { - writePacket(ds2, rifp, isa); + writePacket( rifp, isa); } } } - } - } } } - private void writePacket(KLALBVirtualRawSocket ds2,KLALBRoutingProtocolPacket pkt,SocketAddress dest) throws IOException { + public void sendJsonPacketToAddress(JsonDataPacket pkt,SocketAddress dest) throws IOException { + writePacket(pkt,dest); + } + + private void writePacket(KLALBRoutingProtocolPacket pkt,SocketAddress dest) throws IOException { ByteArrayOutputStream bos=new ByteArrayOutputStream(65535); KLALBRoutingProtocolPacket.writeKLALBPacketToChannel(Channels.newChannel(bos),pkt); byte[]to=bos.toByteArray(); DatagramPacket dgpx=new DatagramPacket(to,to.length); dgpx.setSocketAddress(dest); + sendLock.lock(); try { - ds2.send(dgpx); + ds.send(dgpx); }catch(BindException e) { e.printStackTrace(); System.err.println("Cannot assign:"+dest); + }finally { + sendLock.unlock(); } } @@ -550,7 +574,7 @@ public class KLALBRoutingProtocol extends Thread{ } } } - NeighborInfo ni=new NeighborInfo(nl.getAddressGroup(),addresses.getAddress(),addresses.getLocator(),updelay ,downdelay,updelayMin ,downdelayMin ,uploadspeed ,downloadspeed,uploadspeedmax ,downloadspeedmax); + NeighborInfo ni=new NeighborInfo(nl.getAddressGroups().get(0),addresses.getAddress(),addresses.getLocator(),updelay ,downdelay,updelayMin ,downdelayMin ,uploadspeed ,downloadspeed,uploadspeedmax ,downloadspeedmax); ni.setContext(addresses); ri.getNeighborAddresses().add(ni); @@ -624,9 +648,9 @@ public class KLALBRoutingProtocol extends Thread{ hat.refreshTimeout(); } if(hat.checkReportTime()) { - System.out.println("hotspot address:"+sourceAddress); + //System.out.println("hotspot address:"+sourceAddress); try { - writePacket(ds, new RouterInfoPacket( netmap.get(router.getLocator().getAddress()),false,-1), new InetSocketAddress(sourceAddress, DEFAULT_PORT)); + writePacket( new RouterInfoPacket( netmap.get(router.getLocator().getAddress()),false,-1), new InetSocketAddress(sourceAddress, DEFAULT_PORT)); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIClient.java b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIClient.java new file mode 100644 index 0000000..c33a556 --- /dev/null +++ b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIClient.java @@ -0,0 +1,105 @@ +package org.kne.cloud.network.srv6; + +import java.io.IOException; +import java.lang.ref.Cleaner; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.ThreadTool; +import org.kne.cloud.network.congress.ECNCongressAlgorithm; +import org.kne.cloud.network.congress.EmptyCongressAlgorithm; +import org.kne.cloud.network.congress.SendPacketSlidingWindow; +import org.kne.opencl64.Releaser; + +public class KLALBRoutingProtocolAPIClient { + private KLALBRoutingProtocol routingProtocol; + private SendPacketSlidingWindow window = new SendPacketSlidingWindow( + new EmptyCongressAlgorithm(3000000000L), 1024 * 1024); + + private static final Cleaner clr = Cleaner.create(); + + private BiConsumer rec = (addr, data) -> { + KLALBRoutingProtocolJsonData dataobj = data.getDecodedData(); + InetSocketAddress addrs = (InetSocketAddress) addr; + UUID ruid = dataobj.getUuid(); + JsonDataPacket relate = null; + //System.out.println(ruid + " " + window.getSendmap()); + switch (dataobj.getType()) { + case KLALBRoutingProtocolJsonData.OPEN_LINES_RESP: + + if ((relate = window.ack(ruid)) != null) { + List connects = (List) dataobj.getData(); + List connectsm = new ArrayList(connects.size()); + for (Object open : connects) { + if (open instanceof MultipurposeSocketAddress) { + connectsm.add((MultipurposeSocketAddress) open); + } else { + connectsm.add(new MultipurposeSocketAddress((String) open)); + + } + } + ((Consumer>) relate.getUserCallback()).accept(connectsm); + } + break; + } + + }; + + public KLALBRoutingProtocolAPIClient(KLALBRoutingProtocol routingProtocol) { + this.routingProtocol = routingProtocol; + routingProtocol.addReceiver(rec); + this.releaser = new KLALBRoutingProtocolAPIClientReleaser(this.routingProtocol, rec, window); + clr.register(this, releaser); + } + + public void requestOpenLines(SocketAddress addr, Consumer> callback) + throws IOException { + UUID suid = UUID.randomUUID(); + KLALBRoutingProtocolJsonData json = new KLALBRoutingProtocolJsonData( + KLALBRoutingProtocolJsonData.OPEN_LINES_REQ, suid, null); + JsonDataPacket packet = new JsonDataPacket(json); + packet.setUserCallback(callback); + window.put(suid, packet); + routingProtocol.sendJsonPacketToAddress(packet, addr); + + } + + public KLALBRoutingProtocol getRoutingProtocol() { + return routingProtocol; + } + + private KLALBRoutingProtocolAPIClientReleaser releaser; + + public void close() { + releaser.run(); + } + + public boolean isClosed() { + return releaser.isReleased(); + } +} + +class KLALBRoutingProtocolAPIClientReleaser extends Releaser> { + + private KLALBRoutingProtocol routingProtocol; + private SendPacketSlidingWindow window; + + public KLALBRoutingProtocolAPIClientReleaser(KLALBRoutingProtocol routingProtocol, + BiConsumer resource, SendPacketSlidingWindow window) { + super(resource); + this.routingProtocol = routingProtocol; + this.window = window; + } + + @Override + protected void release(BiConsumer resource) { + window.close(); + routingProtocol.removeReceiver(resource); + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIServer.java b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIServer.java new file mode 100644 index 0000000..7336d19 --- /dev/null +++ b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolAPIServer.java @@ -0,0 +1,81 @@ +package org.kne.cloud.network.srv6; + +import java.io.IOException; +import java.lang.ref.Cleaner; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.ArrayList; +import java.util.UUID; +import java.util.function.BiConsumer; + +import org.kne.cloud.network.MultipurposeSocketAddress; +import org.kne.cloud.network.ThreadTool; +import org.kne.cloud.network.congress.SendPacketSlidingWindow; +import org.kne.cloud.network.klalb.KLALBController; +import org.kne.opencl64.Releaser; + +public class KLALBRoutingProtocolAPIServer { + private KLALBController controller; + private KLALBRoutingProtocol routingProtocol; + + + private static final Cleaner clr=Cleaner.create(); + + private BiConsumer rec=(addr,data)->{ + try { + KLALBRoutingProtocolJsonData dataobj= data.getDecodedData(); + InetSocketAddress addrs=(InetSocketAddress) addr; + switch(dataobj.getType()){ + case KLALBRoutingProtocolJsonData.OPEN_LINES_REQ: + KLALBRoutingProtocolJsonData json=new KLALBRoutingProtocolJsonData(KLALBRoutingProtocolJsonData.OPEN_LINES_RESP,dataobj.getUuid(),controller.getSelflineTable()); + routingProtocol.sendJsonPacketToAddress(new JsonDataPacket(json),addr); + break; + } + } catch (IOException e) { + e.printStackTrace(); + } + }; + + public KLALBRoutingProtocolAPIServer(KLALBRoutingProtocol routingProtocol,KLALBController controller) { + this.controller=controller; + this.routingProtocol=routingProtocol; + routingProtocol.addReceiver(rec); + this.releaser=new KLALBRoutingProtocolAPIServerReleaser(this.routingProtocol,rec); + clr.register(this, releaser); + } + + public KLALBController getController() { + return controller; + } + + public KLALBRoutingProtocol getRoutingProtocol() { + return routingProtocol; + } + + +private KLALBRoutingProtocolAPIServerReleaser releaser; + + public void close() { + releaser.run(); + } + + + public boolean isClosed() { + return releaser.isReleased(); + } + +} +class KLALBRoutingProtocolAPIServerReleaser extends Releaser>{ + + private KLALBRoutingProtocol routingProtocol; + + public KLALBRoutingProtocolAPIServerReleaser(KLALBRoutingProtocol routingProtocol,BiConsumer resource) { + super(resource); + this.routingProtocol=routingProtocol; + } + + @Override + protected void release(BiConsumer resource) { + routingProtocol.removeReceiver(resource); + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolJsonData.java b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolJsonData.java new file mode 100644 index 0000000..f2e8e44 --- /dev/null +++ b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolJsonData.java @@ -0,0 +1,66 @@ +package org.kne.cloud.network.srv6; + +import java.util.UUID; + +public class KLALBRoutingProtocolJsonData { + public static final String OPEN_LINES_REQ="openlinesreq"; + public static final String OPEN_LINES_RESP="openlinesresp"; + private String type; + private UUID uuid; + private Object data; + public String getType() { + return type; + } + public Object getData() { + return data; + } + public UUID getUuid() { + return uuid; + } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((data == null) ? 0 : data.hashCode()); + result = prime * result + ((type == null) ? 0 : type.hashCode()); + result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); + return result; + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + KLALBRoutingProtocolJsonData other = (KLALBRoutingProtocolJsonData) obj; + if (data == null) { + if (other.data != null) + return false; + } else if (!data.equals(other.data)) + return false; + if (type == null) { + if (other.type != null) + return false; + } else if (!type.equals(other.type)) + return false; + if (uuid == null) { + if (other.uuid != null) + return false; + } else if (!uuid.equals(other.uuid)) + return false; + return true; + } + public KLALBRoutingProtocolJsonData(String type, UUID uuid, Object data) { + super(); + this.type = type; + this.uuid = uuid; + this.data = data; + } + @Override + public String toString() { + return "KLALBRoutingProtocolJsonData [type=" + type + ", uuid=" + uuid + ", data=" + data + "]"; + } + +} diff --git a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolPacket.java b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolPacket.java index 6b24daa..6986878 100644 --- a/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolPacket.java +++ b/src/org/kne/cloud/network/srv6/KLALBRoutingProtocolPacket.java @@ -17,6 +17,7 @@ import org.kne.cloud.network.NetworkPacket; public abstract class KLALBRoutingProtocolPacket extends NetworkPacket { public static final int RINFO_REQ=0; public static final int RINFO=1; + public static final int JSON_DATA=2; private static final int HEADER_CAPACITY = 32; @@ -79,7 +80,7 @@ public abstract class KLALBRoutingProtocolPacket extends NetworkPacket { public long getRcvtime() { return rcvtime; } - public long getLength() { + public long getTotalLength() { return getHeaderSize(); } @@ -116,6 +117,10 @@ public abstract class KLALBRoutingProtocolPacket extends NetworkPacket { klp=new RouterInfoPacket(bb); klp.readFromChannel(in); return klp; + case JSON_DATA: + klp=new JsonDataPacket(bb); + klp.readFromChannel(in); + return klp; } //throw new StreamCorruptedException("unknown package type:"+type); System.err.println("ignore unknown KLALBRoutingProtocolPacket type:"+type); diff --git a/src/org/kne/cloud/network/srv6/PADNSegmentRoutingTLV.java b/src/org/kne/cloud/network/srv6/PADNSegmentRoutingTLV.java index 22fcd83..e36ec93 100644 --- a/src/org/kne/cloud/network/srv6/PADNSegmentRoutingTLV.java +++ b/src/org/kne/cloud/network/srv6/PADNSegmentRoutingTLV.java @@ -16,17 +16,4 @@ public class PADNSegmentRoutingTLV extends IPv6SegmentRoutingTLV { getData().limit(dataLength); } - @Override - public void writeToChannel(WritableByteChannel dto) throws IOException { - - super.writeToChannel(dto); - - } - - @Override - public void readFromChannel(ReadableByteChannel din, long length) throws IOException { - super.readFromChannel(din, length); - - } - } diff --git a/src/org/kne/cloud/network/srv6/PacketConsumer.java b/src/org/kne/cloud/network/srv6/PacketConsumer.java index a18ba96..12055c4 100644 --- a/src/org/kne/cloud/network/srv6/PacketConsumer.java +++ b/src/org/kne/cloud/network/srv6/PacketConsumer.java @@ -6,5 +6,5 @@ import org.kne.cloud.network.ipv6.IPv6Packet; import org.pcap4j.packet.IpV6Packet; public interface PacketConsumer { - public void accept(IPv6Packet packx)throws IOException; + public boolean accept(IPv6Packet packx)throws IOException; } diff --git a/src/org/kne/cloud/network/srv6/RouterInfo.java b/src/org/kne/cloud/network/srv6/RouterInfo.java index fc1a9a7..6993df1 100644 --- a/src/org/kne/cloud/network/srv6/RouterInfo.java +++ b/src/org/kne/cloud/network/srv6/RouterInfo.java @@ -67,7 +67,7 @@ public class RouterInfo implements Serializable{ return createTime; } private static final long INFO_UPDATETIME=10000000000L; - private static final long INFO_TIMEOUT=120000000000L; + private static final long INFO_TIMEOUT=60000000000L; private long putTime=System.nanoTime(); public boolean checkUpdateTime() { return System.nanoTime()-putTime>INFO_UPDATETIME; @@ -77,6 +77,10 @@ public class RouterInfo implements Serializable{ return System.nanoTime()-putTime>INFO_TIMEOUT; } + public boolean checkTimeOut(long timeout) { + return System.nanoTime()-putTime>timeout; + } + @Override public String toString() { return "RINFO [locator=" + locator + ", neighborAddresses=" + neighborAddresses + ", putTime=" + putTime @@ -123,4 +127,5 @@ public class RouterInfo implements Serializable{ } } + } diff --git a/src/org/kne/cloud/network/srv6/RouterInfoPacket.java b/src/org/kne/cloud/network/srv6/RouterInfoPacket.java index 719df6a..e1d125d 100644 --- a/src/org/kne/cloud/network/srv6/RouterInfoPacket.java +++ b/src/org/kne/cloud/network/srv6/RouterInfoPacket.java @@ -52,8 +52,8 @@ public class RouterInfoPacket extends KLALBRoutingProtocolPacket implements Seri return super.getHeaderSize()+9; } @Override - public long getLength() { - return super.getLength(); + public long getTotalLength() { + return super.getTotalLength(); } public void setRinfo(RouterInfo rinfo) { this.rinfo = rinfo; diff --git a/src/org/kne/cloud/network/srv6/SRv6PacketReorder.java b/src/org/kne/cloud/network/srv6/SRv6PacketReorder.java index c46f395..68c6345 100644 --- a/src/org/kne/cloud/network/srv6/SRv6PacketReorder.java +++ b/src/org/kne/cloud/network/srv6/SRv6PacketReorder.java @@ -25,6 +25,7 @@ public class SRv6PacketReorder { private class PacketTimeEntry{ private IPv6Packet packet; + private boolean accepted=false; private long addTime; public PacketTimeEntry(IPv6Packet packet) { super(); @@ -59,10 +60,20 @@ public class SRv6PacketReorder { //System.out.println("Ord:"+i6p.getFlowLabel()+" "+seqptr.get()); seqptr.getAndIncrement(); orderTime=System.nanoTime(); - if(packetConsumer!=null) { + if(packetConsumer!=null&&(!i6p.accepted)) { + i6p.accepted=true; packetConsumer.accept(i6p.packet); } }else { + for(int i=1;i<5;i++) { + PacketTimeEntry i6px=map.get(seqptr.get()+i); + if(i6px!=null) { + if(packetConsumer!=null&&(!i6px.accepted)) { + i6px.accepted=true; + packetConsumer.accept(i6px.packet); + } + } + } break; } } diff --git a/src/org/kne/cloud/network/srv6/SRv6Router.java b/src/org/kne/cloud/network/srv6/SRv6Router.java index 0118131..a33f58d 100644 --- a/src/org/kne/cloud/network/srv6/SRv6Router.java +++ b/src/org/kne/cloud/network/srv6/SRv6Router.java @@ -2,13 +2,10 @@ package org.kne.cloud.network.srv6; import java.io.IOException; import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.InetSocketAddress; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.security.SecureRandom; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -17,306 +14,211 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.Map.Entry; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.ThreadLocalRandom; -import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Consumer; import org.kne.cloud.network.NetworkPacket; -import org.kne.cloud.network.ipv6.FlowSession; +import org.kne.cloud.network.ipv6.ICMPv6TimeExceededPacket; +import org.kne.cloud.network.ipv6.IPv6HopByHopTLV; +import org.kne.cloud.network.ipv6.IPv6LinkStateListener; import org.kne.cloud.network.ipv6.IPv6NetworkLink; import org.kne.cloud.network.ipv6.IPv6Packet; -import org.kne.cloud.network.ipv6.IPv6Packet.IPv6DestinationHeader; -import org.kne.cloud.network.ipv6.IPv6Packet.IPv6ExtHeader; +import org.kne.cloud.network.ipv6.IPv6Packet.IPv6HopByHopHeader; import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload; -import org.kne.cloud.network.ipv6.IPv6Packet.IPv6RoutingHeader; import org.kne.cloud.network.ipv6.IPv6Packet.IPv6SegmentRoutingHeader; -import org.kne.cloud.network.ipv6.IPv6TUNLoopbackNetworkLink; +import org.kne.cloud.network.ipv6.IPv6RouteTableKey; import org.kne.cloud.network.ipv6.Inet6AddressGroup; +import org.kne.cloud.network.ipv6.LoopbackIPv6NetworkLink; import org.kne.cloud.network.ipv6.Neighbor; +import org.kne.cloud.network.ipv6.PadNHopByHopTLV; import org.kne.cloud.network.ipv6.RouteItem; -import org.kne.cloud.network.klalb.BindableKLALBPacketConsumer; -import org.kne.cloud.network.klalb.KLALBController; -import org.kne.cloud.network.klalb.KLALBRemoteLine; -import org.kne.cloud.network.monitor.MonitorData; -import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl; -import org.kne.cloud.network.tun.TUNNetworkDevice; -import org.kne.concurrent.HighPerformanceExecutor; import org.kne.io.KNEChannels; import org.pcap4j.packet.IcmpV6CommonPacket; import org.pcap4j.packet.IcmpV6TimeExceededPacket; import org.pcap4j.packet.IllegalRawDataException; -import org.pcap4j.packet.IpV6ExtRoutingPacket; -import org.pcap4j.packet.IpV6ExtRoutingPacket.IpV6ExtRoutingHeader; +import org.pcap4j.packet.IpV6ExtHopByHopOptionsPacket.IpV6ExtHopByHopOptionsHeader; import org.pcap4j.packet.IpV6Packet; -import org.pcap4j.packet.IpV6Packet.Builder; -import org.pcap4j.packet.IpV6RoutingSourceRouteData; -import org.pcap4j.packet.IpV6SimpleFlowLabel; -import org.pcap4j.packet.IpV6SimpleTrafficClass; -import org.pcap4j.packet.Packet; -import org.pcap4j.packet.Packet.Header; -import org.pcap4j.packet.TcpPacket; -import org.pcap4j.packet.TcpPacket.TcpHeader; -import org.pcap4j.packet.UnknownPacket; import org.pcap4j.packet.namednumber.IcmpV6Code; import org.pcap4j.packet.namednumber.IcmpV6Type; import org.pcap4j.packet.namednumber.IpNumber; -import org.pcap4j.packet.namednumber.IpV6RoutingType; -import org.pcap4j.packet.namednumber.IpVersion; - -import com.google.gson.internal.Pair; +// SRv6路由器主类,实现IPv6段路由功能 public class SRv6Router { - private static final boolean debug = false; + private static final boolean debug = false; // 调试模式开关 - public static final int MTU = 16384; + // public static final int MTU = 16384; + public static final int MTU = 16384; // 最大传输单元 + public static final int MAX_REROUTE_COUNT = 2;// 1 // 最大重路由次数 - public static final int MAX_REROUTE_COUNT=2;//1 + private static final Inet6Address LOOPBACK_ADDRESS = getLoopbackAddress(); // 环回地址 + private static final Inet6Address ANY_LOCAL_ADDRESS = getAnyLocalAddress(); // 任意本地地址 + + private static final int IPv6_BITS = 128; // IPv6地址位数 - public static final IpV6RoutingType SRH_HEADER = new IpV6RoutingType((byte) 4, "SRH Header"); - // private Listlinks=new ArrayList<>(); + // 获取环回地址 ::1 + private static Inet6Address getLoopbackAddress() { + try { + return (Inet6Address) Inet6Address.getByName("::1"); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return null; + } - private List routeTabel = new ArrayList<>(); + // 获取任意本地地址 ::0 + private static Inet6Address getAnyLocalAddress() { + try { + return (Inet6Address) Inet6Address.getByName("::0"); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return null; + } - private List linkTabel = new CopyOnWriteArrayList<>(); + private List routeTabel = new ArrayList<>(); // 路由表 + + private List linkTabel = new CopyOnWriteArrayList<>(); // 网络链路表,线程安全 public List getLinkTabel() { return linkTabel; } - // private ConcurrentHashMapswis=new - // ConcurrentHashMap<>(); - - private final LoopbackIPv6NetworkLink inLoopBack = new LoopbackIPv6NetworkLink(); - //private final LoopbackIPv6NetworkLink inLoopBackSRv6; - private final LoopbackIPv6NetworkLink hostLoopBack ; - - private class LoopbackIPv6NetworkLink implements IPv6NetworkLink { - private Inet6AddressGroup loopbackAddress; - - public LoopbackIPv6NetworkLink() { - super(); - try { - this.loopbackAddress=new Inet6AddressGroup( (Inet6Address) Inet6Address.getByName("::1"),128); - } catch (UnknownHostException e) { - // TODO 自动生成的 catch 块 - e.printStackTrace(); - } - } - - public LoopbackIPv6NetworkLink(Inet6Address loopbackAddress) { - super(); - this.loopbackAddress = new Inet6AddressGroup(loopbackAddress,128); - } - - public Consumer getReceiveConsumer() { - return receiveConsumer; - } - - private Consumer receiveConsumer; - - @Override - public void sendPacket(IPv6Packet pack, Inet6Address next) throws IOException { - PacketConsumer pcm; - if ((pcm = protocolNumberRegister.get(pack.getPayload().getProtocolNumber())) != null) { - pcm.accept(pack); - - return; - } - } - - @Override - public boolean isLoopBack() { - return true; - } - - @Override - public List getNeighborsInfo() { - List hs = new ArrayList<>(); - return hs; - } - - @Override - public boolean isCongress(IPv6Packet iPv6Packet,double scale) { - return false; - } - - @Override - public String getName() { - return "inLoopBack"; - } - - @Override - public boolean isUp() { - return true; - } - - @Override - public boolean canSend(IPv6Packet iPv6Packet) { - //System.out.println(iPv6Packet.getPayload().getProtocolNumber()); - return protocolNumberRegister.containsKey(iPv6Packet.getPayload().getProtocolNumber()); - } - - @Override - public void setReceiveConsumer(Consumer con) { - this.receiveConsumer = con; - } - - @Override - public Inet6AddressGroup getAddressGroup() { - return loopbackAddress; - } - - @Override - public void setRerouteConsumer(Consumer rerouteConsumer) { - // TODO 自动生成的方法存根 - - } - - @Override - public List getRouteItems() { - List rlist=new ArrayList<>(); - - rlist.add(new RouteItem(new Inet6AddressGroup(this.getAddressGroup().getAddress(), 128), - this.getAddressGroup().getAddress(), this, "Direct", 0, 0, null, "D",true)); - - for (Iterator iteratorx = getNeighborsInfo() - .iterator(); iteratorx.hasNext();) { - Neighbor addresses = (Neighbor) iteratorx.next(); - RouteItem ri = new RouteItem(new Inet6AddressGroup(addresses.getAddress().getAddress(), 128), addresses.getAddress().getAddress(), - this, "Direct", 0, 128, addresses.getMonitor(), "D",false); - rlist.add(ri); - - RouteItem ris = new RouteItem(addresses.getLocator(), (Inet6Address) addresses.getLocator().getAddress(), - this, "KLALB SRv6", 13, 128, addresses.getMonitor(), "D",false); - rlist.add(ris); - - } - return rlist; - } - - @Override - public boolean isReachSpeedLimit(IPv6Packet iPv6Packet) { - return false; - } - - - }; + // 环回网络链路 + private final LoopbackIPv6NetworkLink inLoopBack ; + // 获取路由表 public List getRouteTabel() { return routeTabel; } + // 获取当前路由表 public List getCurrentRouteTabel() { - return routeTabel0; + return routeTable0; } - + // 默认重路由处理器 private Consumer defaultReroute = new Consumer() { @Override public void accept(IPv6Packet t) { - //HighPerformanceExecutor.defaultExecutor.execute(() -> { - routePacket(t,true); - t.putTimePassport("rerouted"); - //}); + // HighPerformanceExecutor.defaultExecutor.execute(() -> { + routePacket(t, true); // 执行重路由 + t.putTimePassport("rerouted"); // 标记重路由时间点 + // }); } }; + + // 默认接收处理器 private Consumer defaultReceive = new Consumer() { @Override public void accept(IPv6Packet t) { - //HighPerformanceExecutor.defaultExecutor.execute(() -> { - routePacket(t); - t.putTimePassport("routed"); - //}); + // HighPerformanceExecutor.defaultExecutor.execute(() -> { + routePacket(t); // 执行路由 + t.putTimePassport("routed"); // 标记路由时间点 + // }); } }; + + // SRH接收处理器 private Consumer srhReceive = new Consumer() { @Override public void accept(IPv6Packet t) { - //HighPerformanceExecutor.defaultExecutor.execute(() -> { - insertSRHandRoutePacket(t); - //}); + // HighPerformanceExecutor.defaultExecutor.execute(() -> { + insertSRHandRoutePacket(t); // 插入SRH并路由数据包 + // }); } }; + + private volatile UUID suid = UUID.randomUUID(); // 会话唯一标识 + + // 链路状态监听器实现 + private class LinkListener implements IPv6LinkStateListener{ + + @Override + public void onOnlineStateUpdate(IPv6NetworkLink link) { + srListeners.forEach((v)->{v.onLinkChanged(SRv6Router.this,link);}); // 通知所有监听器链路状态变化 + } + + @Override + public void onAddressUpdate(IPv6NetworkLink link) { + srListeners.forEach((v)->{v.onLinkChanged(SRv6Router.this,link);}); // 通知所有监听器地址更新 + } + + @Override + public void onLocatorUpdate(IPv6NetworkLink link) { + srListeners.forEach((v)->{v.onLinkChanged(SRv6Router.this,link);}); // 通知所有监听器定位器更新 + } + + } + private IPv6LinkStateListener listener=new LinkListener(); // 链路状态监听器实例 - private volatile UUID suid=UUID.randomUUID(); + private Set srListeners=new CopyOnWriteArraySet(); // SRv6路由器监听器集合 + + // 添加SRv6路由器监听器 + public void addSRv6RouterListener(SRv6RouterListener listener) { + srListeners.add(listener); + } + + // 移除SRv6路由器监听器 + public void removeSRv6RouterListener(SRv6RouterListener listener) { + srListeners.remove(listener); + } + + // 更新路由表 public void updateRouteTabel() { List routeTabel0x = new ArrayList<>(); - + + // 遍历所有网络链路,收集路由信息 for (Iterator iterator = linkTabel.iterator(); iterator.hasNext();) { IPv6NetworkLink nlink = (IPv6NetworkLink) iterator.next(); - /*if (nlink.isLoopBack()) { - if (nlink instanceof IPv6TUNLoopbackNetworkLink) { - routeTabel0x.add(new RouteItem(new Inet6AddressGroup(nlink.getAddressGroup().getAddress(), 128), - nlink.getAddressGroup().getAddress(), nlink, "Direct", 0, 1, null, "D")); - - } else { - routeTabel0x.add(new RouteItem(new Inet6AddressGroup(nlink.getAddressGroup().getAddress(), 128), - nlink.getAddressGroup().getAddress(), nlink, "Direct", 0, 0, null, "D")); - - } - } - for (Iterator iteratorx = nlink.getNeighborsInfo() - .iterator(); iteratorx.hasNext();) { - Neighbor addresses = (Neighbor) iteratorx.next(); - RouteItem ri = new RouteItem(new Inet6AddressGroup(addresses.getAddress().getAddress(), 128), addresses.getAddress().getAddress(), - nlink, "Direct", 0, 128, addresses.getMonitor(), "D"); - routeTabel0x.add(ri); - - RouteItem ris = new RouteItem(addresses.getLocator(), (Inet6Address) addresses.getLocator().getAddress(), - nlink, "KLALB SRv6", 13, 128, addresses.getMonitor(), "D"); - routeTabel0x.add(ris); - - }*/ - - Listroutes=nlink.getRouteItems(); - routeTabel0x.addAll(routes); + List routes = nlink.getRouteItems(); // 获取链路的路由项 + routeTabel0x.addAll(routes); // 添加到路由表 - if (nlink instanceof IPv6TUNLoopbackNetworkLink) { - - nlink.setReceiveConsumer(srhReceive); - } else { - nlink.setReceiveConsumer(defaultReceive); - } - nlink.setRerouteConsumer(defaultReroute); + nlink.addIPv6LinkStateListener(listener); // 添加链路状态监听器 + nlink.setReceiveConsumer(srhReceive); // 设置接收处理器 + nlink.setRerouteConsumer(defaultReroute); // 设置重路由处理器 + nlink.setCongressCondition(congressLock, congressCondition); // 设置拥塞条件 } - /*List routeTabel1x=new ArrayList<>(routeTabel0x.size()); + // 预处理和排序路由项 + for (Iterator iterator = routeTabel0x.iterator(); iterator.hasNext();) { + RouteItem routeItem = (RouteItem) iterator.next(); + routeItem.preSort(); // 预排序 + } + Collections.sort(routeTabel0x); // 排序路由表 - routeTabel0x.addAll(routeTabel); - for (Iterator iterator = routeTabel0x.iterator(); iterator.hasNext();) { - RouteItem routeItem = (RouteItem) iterator.next(); - routeTabel1x.add((RouteItem) routeItem.clone()); - }*/ - for (Iterator iterator = routeTabel0x.iterator(); iterator.hasNext();) { - RouteItem routeItem = (RouteItem) iterator.next(); - routeItem.preSort(); - + // 构建前缀长度索引的路由表 + ArrayList>> routeTabel1x=new ArrayList>>(IPv6_BITS+1); + for (int i = 0; i < IPv6_BITS+1; i++) { + routeTabel1x.add(new HashMap>()); } - Collections.sort(routeTabel0x); - routeTabel0 = routeTabel0x; - suid=UUID.randomUUID(); + + // 按前缀长度组织路由表 + for (RouteItem item: routeTabel0x) { + Inet6AddressGroup iag= item.getDestination(); + Map> map= routeTabel1x.get(iag.getPrefixLength()); + Listnewlist=new ArrayList(); + Listoldlist=map.putIfAbsent(new IPv6RouteTableKey( iag.getAddress()), newlist); + if(oldlist==null) { + oldlist=newlist; + } + oldlist.add(item); + } + //System.out.println(routeTabel1x); + routeTable0 = routeTabel0x; // 更新平面路由表 + routeTabel1=routeTabel1x; // 更新索引路由表 + suid = UUID.randomUUID(); // 更新会话ID } - private Inet6AddressGroup locator; - private long asn=new SecureRandom().nextLong(1,Long.MAX_VALUE); - /* - * public List getLinks() { return links; } - */ - - - + private Inet6AddressGroup locator; // SRv6定位器 + private long asn = new SecureRandom().nextLong(1, Long.MAX_VALUE); // 自治系统号 public Inet6AddressGroup getLocator() { return locator; @@ -330,439 +232,414 @@ public class SRv6Router { this.asn = asn; } + // 设置定位器并更新路由表 public void setLocator(Inet6AddressGroup locator) { this.locator = locator; updateRouteTabel(); } - - //private ConcurrentHashMap swist = new ConcurrentHashMap<>(); - + // 插入SRH并路由数据包 public void insertSRHandRoutePacket(IPv6Packet ipp) { - insertSRH(ipp); - ipp.putTimePassport("SRH inserted"); - routePacket(ipp); - ipp.putTimePassport("routed"); + insertSRH(ipp); // 插入段路由头 + ipp.putTimePassport("SRH inserted"); // 标记SRH插入时间点 + routePacket(ipp); // 路由数据包 + ipp.putTimePassport("routed"); // 标记路由时间点 } - - - public void insertSRH(IPv6Packet ipp) { - if(ipp.getSRHHeader()!=null) { - throw new IllegalStateException("packet already has SRH!"); - } + + // 插入段路由头 + public boolean insertSRH(IPv6Packet ipp) { + // 如果已有SRH,返回false + if (ipp.getSRHHeader() != null) { + return false; + } + // 如果KLALB路由协议可用,创建段列表 if (klalbRouteProtol != null) { List segs = klalbRouteProtol.createSegmentList(ipp.getDestinationAddress()); // System.out.println(segs); if (segs != null && (!segs.isEmpty())) { - + IPv6HopByHopHeader hbh=new IPv6HopByHopHeader(); + hbh.getTlvs().add(new PadNHopByHopTLV(4)); + ipp.getHeaders().add(hbh); // 添加Hop头 + // 创建SRH头 IPv6SegmentRoutingHeader irh = new IPv6SegmentRoutingHeader(segs); - - //System.out.println(ipp.getFlowLabel()); - ThreadLocalRandom tlr=ThreadLocalRandom.current(); - //System.out.println(ipp.getFlowSeqMark()); - irh.getTlvs().add(new SEQSSegmentRoutingTLV(ipp.getFlowSeqMark(),new UUID(suid.getMostSignificantBits()^tlr.nextLong(),suid.getMostSignificantBits()^tlr.nextLong()),ipp.isPromise(),ipp.getFlowSeqMark()!=-1)); - - ipp.getHeaders().add(irh); - - ipp.setDestinationAddress(segs.get(segs.size() - 1)); - + + // System.out.println(ipp.getFlowLabel()); + ThreadLocalRandom tlr = ThreadLocalRandom.current(); + // System.out.println(ipp.getFlowSeqMark()); + // 添加序列号TLV + irh.getTlvs() + .add(new SEQSSegmentRoutingTLV(ipp.getFlowSeqMark(), + new UUID(suid.getMostSignificantBits() ^ tlr.nextLong(), + suid.getMostSignificantBits() ^ tlr.nextLong()), + ipp.isPromise(), ipp.getFlowSeqMark() != -1)); + + ipp.getHeaders().add(irh); // 添加SRH头 + + ipp.setDestinationAddress(segs.get(segs.size() - 1)); // 更新目的地址为最后一个段 + + return true; } } - } - - - private volatile List routeTabel0 = new ArrayList<>(); - - // private ReentrantReadWriteLock routelock=new ReentrantReadWriteLock(); - - - //路由数据包 - public void routePacket(IPv6Packet iPv6Packet) { - routePacket(iPv6Packet ,false); - } - //路由数据包 - public void routePacket(IPv6Packet iPv6Packet, boolean reroute) { - // routelock.readLock().lock(); - // try { - // System.out.println("路由表:"+routeTabel0); - StringBuilder dbg=null; - if (debug) { - dbg=new StringBuilder(); - } - try { - int hop = iPv6Packet.getHopLimit();//检查TTL值,只有大于0才会被转发,否则丢弃 - if (hop > 0) { - // List mached=new ArrayList<>(); - // RouteItem pri=null; - - - //按延迟顺序从小到大匹配路由表 - if(searchTableAndFoward(iPv6Packet, reroute, dbg)) { - //匹配到路由表,返回 - return ; - } - - - if (debug) - dbg.append("noroute\n"); - //System.out.println("找不到路由表:"+iPv6Packet.getSourceAddress().getHostAddress()+" -> "+iPv6Packet.getDestinationAddress().getHostAddress()); - - //未找到合适的路由表或路由表对应的链路down,使用FRR保护创建备用路由表 - IPv6SegmentRoutingHeader srh=iPv6Packet.getSRHHeader(); - if(srh!=null) { - System.out.println("原SRH:"+srh); - int segmentsLeft=srh.getSegmentsLeft(); - if(segmentsLeft>0) { - srh.getAddresses().remove(segmentsLeft); - segmentsLeft--; - } - List repairSegments= klalbRouteProtol.createSegmentList(srh.getAddresses().get(segmentsLeft)); - if(repairSegments ==null||repairSegments.isEmpty()) { - System.out.println("FRR保护失败"); - return; - } - repairSegments.remove(0); - srh.getAddresses().addAll(segmentsLeft+1, repairSegments); - segmentsLeft+=repairSegments.size(); - srh.setSegmentsLeft(segmentsLeft); - iPv6Packet.setDestinationAddress(srh.getAddresses().get(segmentsLeft)); - }else { - return; - } - System.out.println("FRR修复SRH:"+srh); - if(searchTableAndFoward(iPv6Packet, reroute, dbg)) { - return ; - } - - - } else { - IcmpV6TimeExceededPacket.Builder icmpte = new IcmpV6TimeExceededPacket.Builder(); - ByteBuffer IPv6data = NetworkPacket.bufferAllocator.allocate(65535); - iPv6Packet.writeToChannel(KNEChannels.newWritableChannel(IPv6data)); - byte[] raw = new byte[IPv6data.remaining()]; - IPv6data.get(0, raw); - icmpte.payload(IpV6Packet.newPacket(raw, 0, raw.length)); - - IcmpV6CommonPacket.Builder icbd = new IcmpV6CommonPacket.Builder(); - icbd.type(IcmpV6Type.TIME_EXCEEDED); - icbd.code(IcmpV6Code.HOP_LIMIT_EXCEEDED); - icbd.srcAddr(locator.getAddress()); - icbd.dstAddr(iPv6Packet.getSourceAddress()); - icbd.correctChecksumAtBuild(true); - icbd.payloadBuilder(icmpte); - - IPv6Packet icmpv = new IPv6Packet(); - icmpv.setSourceAddress(locator.getAddress()); - icmpv.setDestinationAddress(iPv6Packet.getSourceAddress()); - icmpv.setTrafficClass(iPv6Packet.getTrafficClass()); - icmpv.setVersion(6); - icmpv.setFlowLabel(0); - icmpv.setHopLimit(255); - IPv6Payload ipl = new IPv6Payload(IpNumber.ICMPV6.value()); - ipl.getData().put(icbd.build().getRawData()); - ipl.getData().flip(); - icmpv.setPayload(ipl); - insertSRHandRoutePacket(icmpv); - } - } catch (Exception e) { - e.printStackTrace(); - }finally { - if(debug) { - System.out.println(dbg.toString()); - } - } - // }finally { - // routelock.readLock().unlock(); - // } - } - - private boolean searchTableAndFoward(IPv6Packet iPv6Packet, boolean reroute, StringBuilder dbg) - throws IllegalRawDataException, IOException { - byte[] ia = new byte[16]; - iPv6Packet.getRawDestinationAddress(ia); - if (debug) { - dbg.append("----------------------------------------\n"); - dbg.append("packet:" + iPv6Packet.getSourceAddress().getHostAddress() + " -> " - + iPv6Packet.getDestinationAddress().getHostAddress()+"\n"); - } - - boolean routeFound=false; - - RouteItem prevr=null; - List routes=new ArrayList<>(); - //遍历路由表 - for (RouteItem tri: routeTabel0) { - if(!tri.checkMatch(ia)) { - if (debug) { - dbg.append(tri+"\n"); - dbg.append("unmatched.\n"); - } - //跳过前缀与掩码不符合要求的路由表条目 - continue; - } - if (!tri.getDestlink().canSend(iPv6Packet)) { - if (debug) { - dbg.append(tri+"\n"); - dbg.append("linkrefused.\n"); - } - //跳过不能转发这种数据包的链路 - continue; - } - if (!tri.getDestlink().isUp()) { - if (debug) { - dbg.append(tri+"\n"); - dbg.append("linkdown.\n"); - } - //跳过断开连接的链路 - continue; - } - routeFound=true; - if(prevr!=null) { - if(!tri.ECMPequals(prevr)) { - //执行流量整形负载均衡调度算法 - if(routingLoadBalance(iPv6Packet, reroute, dbg, routes)) { - return routeFound; - } - routes.clear(); - } - } - //将等价路由加入负载均衡列表 - routes.add(tri); - - prevr=tri; - - - - } - routingLoadBalance(iPv6Packet, reroute, dbg, routes); - return routeFound; - } - - private boolean routingLoadBalance(IPv6Packet iPv6Packet, boolean reroute, StringBuilder dbg, List routes) - throws IllegalRawDataException, IOException { - - double cscale=1.0; - if(iPv6Packet.getPayload().getProtocolNumber()==6) { - cscale=15.0; - } - - boolean retry=false; - long start=System.nanoTime(); - do { - retry=false; - //遍历可用于负载均衡调度的路由表 - for (RouteItem tri: routes) { - if (!tri.getDestlink().isUp()) { - if (debug) { - dbg.append(tri+"\n"); - dbg.append("linkdown.\n"); - } - //跳过断开的链路 - continue; - } - if (tri.getDestlink().isCongress(iPv6Packet,cscale)) { - if (debug) { - dbg.append(tri+"\n"); - dbg.append("congress.\n"); - } - //跳过缓冲区拥塞的链路 - continue; - } - - if (tri.getDestlink().isReachSpeedLimit(iPv6Packet)) { - retry=true; - if (debug) { - dbg.append(tri+"\n"); - dbg.append("reachspeedlimit.\n"); - } - //跳过达到流量整形速度限制的链路(若仅超过流量整形速度限制,可多次重试) - continue; - } - - if (debug) { - dbg.append(tri+"\n"); - dbg.append("matched.\n"); - } - //链路可用,处理并转发数据包 - processPacket(iPv6Packet, tri,reroute); - return true; - - } - if(retry) { - if(System.nanoTime()-start>1000000L) { - break; - } - /*try { - Thread.sleep(1); - } catch (InterruptedException e) { - e.printStackTrace(); - }*/ - Thread.yield(); - //短暂挂起当前线程,待链路速度未超限时重试发送数据包 - } - }while((!routes.isEmpty())&&retry); - if (debug) { - dbg.append("miss.\n"); - } - //负载均衡未匹配成功,若数据包支持ECN,打上拥塞标记位 - if(iPv6Packet.isEnableECN()) { - iPv6Packet.markCE(); - if (debug) { - dbg.append("ECN enabled.\n"); - } - } - - for (RouteItem tri: routes) { - - if (!tri.getDestlink().isUp()) { - if (debug) { - dbg.append(tri+"\n"); - dbg.append("linkdown.\n"); - } - continue; - } - if (tri.getDestlink().isCongress(iPv6Packet,25.0)) { - if (debug) { - dbg.append(tri+"\n"); - dbg.append("congress.\n"); - } - //缓冲区留部分余量避免丢包 - continue; - } - processPacket(iPv6Packet, tri,reroute); - return true; - } - //仍未成功发送,丢弃数据包 return false; } - private void processPacket(IPv6Packet iPv6Packet, RouteItem ri, boolean reroute) throws IllegalRawDataException, IOException { - int hop = iPv6Packet.getHopLimit(); - - if (ri.getDestlink().isLoopBack()) { - IPv6SegmentRoutingHeader srhh =iPv6Packet. getSRHHeader(); - if (srhh != null) { - processSRv6Packet(iPv6Packet, ri, srhh,reroute); - } else { - ri.getDestlink().sendPacket(iPv6Packet, ri.getNexthop()); - } - } else { - if(iPv6Packet.getRerouteCounter().getAndIncrement()>=MAX_REROUTE_COUNT) { - - //System.out.println("reroute count >=2"); - return; - } - - if(!reroute) { - // if(!iPv6Packet.isTTLdecreased()) { - hop--; - /* iPv6Packet.setTTLdecreased(true); - }else { - System.out.print("ttl err"); - }*/ - } - // System.out.println(ipp.getHeader().getSrcAddr()+"->"+ipp.getHeader().getDstAddr()+" - // "+(hop+1)+"->"+hop); - if (hop > 0) { - - iPv6Packet.setHopLimit(hop); - ri.getDestlink().sendPacket(iPv6Packet, ri.getNexthop()); - } else { - IcmpV6TimeExceededPacket.Builder icmpte = new IcmpV6TimeExceededPacket.Builder(); - ByteBuffer IPv6data = NetworkPacket.bufferAllocator.allocate(65535); - iPv6Packet.writeToChannel(KNEChannels.newWritableChannel(IPv6data)); - byte[] raw = new byte[IPv6data.remaining()]; - IPv6data.get(0, raw); - icmpte.payload(IpV6Packet.newPacket(raw, 0, raw.length)); + private volatile List routeTable0 = new ArrayList<>(); // 当前路由表 - IcmpV6CommonPacket.Builder icbd = new IcmpV6CommonPacket.Builder(); - icbd.type(IcmpV6Type.TIME_EXCEEDED); - icbd.code(IcmpV6Code.HOP_LIMIT_EXCEEDED); - icbd.srcAddr(locator.getAddress()); - icbd.dstAddr(iPv6Packet.getSourceAddress()); - icbd.correctChecksumAtBuild(true); - icbd.payloadBuilder(icmpte); - - IPv6Packet icmpv = new IPv6Packet(); - icmpv.setSourceAddress(locator.getAddress()); - icmpv.setDestinationAddress(iPv6Packet.getSourceAddress()); - icmpv.setTrafficClass(iPv6Packet.getTrafficClass()); - icmpv.setVersion(6); - icmpv.setFlowLabel(0); - icmpv.setHopLimit(255); - IPv6Payload ipl = new IPv6Payload(IpNumber.ICMPV6.value()); - ipl.getData().put(icbd.build().getRawData()); - ipl.getData().flip(); - icmpv.setPayload(ipl); - insertSRHandRoutePacket(icmpv); - } + // 前缀长度索引的路由表 + private volatile ArrayList>> routeTabel1=new ArrayList>>(IPv6_BITS+1); + { + // 初始化索引路由表 + for (int i = 0; i < IPv6_BITS+1; i++) { + routeTabel1.add(new HashMap>()); } - } - private void processSRv6Packet(IPv6Packet iPv6Packet, RouteItem ri, IPv6SegmentRoutingHeader srhh, boolean reroute) + // 路由数据包(默认非重路由) + private void routePacket(IPv6Packet iPv6Packet) { + routePacket(iPv6Packet, false); + } + + // 路由数据包主方法 + private void routePacket(IPv6Packet iPv6Packet, boolean reroute) { + StringBuilder dbg = null; + if (debug) { + dbg = new StringBuilder(); // 调试信息 + } + try { + int hop = iPv6Packet.getHopLimit(); // 获取跳数限制 + if (hop > 0) { // 检查TTL值,只有大于0才会被转发 + // 搜索匹配的路由表项 + ListsearchResult=searchTable(iPv6Packet, reroute, dbg); + if (!searchResult.isEmpty()) { + // 匹配到路由表,执行负载均衡路由 + routingLoadBalance(iPv6Packet, reroute, dbg, searchResult); + return; + } + + if (debug) + dbg.append("noroute\n"); + + // 未找到路由,尝试FRR(快速重路由)保护 + IPv6SegmentRoutingHeader srh = iPv6Packet.getSRHHeader(); + if (srh != null) { + System.out.println("原SRH:" + srh); + int segmentsLeft = srh.getSegmentsLeft(); + if (segmentsLeft > 0) { + srh.getAddresses().remove(segmentsLeft); // 移除当前故障段 + segmentsLeft--; + } + // 创建修复段列表 + List repairSegments = klalbRouteProtol + .createSegmentList(srh.getAddresses().get(segmentsLeft)); + if (repairSegments == null || repairSegments.isEmpty()) { + System.out.println("FRR保护失败"); + return; + } + repairSegments.remove(0); // 移除第一个段(当前节点) + srh.getAddresses().addAll(segmentsLeft + 1, repairSegments); // 添加修复段 + segmentsLeft += repairSegments.size(); // 更新剩余段数 + srh.setSegmentsLeft(segmentsLeft); + iPv6Packet.setDestinationAddress(srh.getAddresses().get(segmentsLeft)); // 更新目的地址 + } else { + return; + } + System.out.println("FRR修复SRH:" + srh); + // 重新搜索路由表 + ListsearchResult2=searchTable(iPv6Packet, reroute, dbg); + if (!searchResult2.isEmpty()) { + routingLoadBalance(iPv6Packet, reroute, dbg, searchResult2); + return; + } + + } else { + // TTL超时,发送ICMP超时消息 + sendTTLExceedPacket(iPv6Packet); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (debug) { + System.out.println(dbg.toString()); // 输出调试信息 + } + } + } + + // 搜索路由表找到匹配的路由项 + private List searchTable(IPv6Packet iPv6Packet, boolean reroute, StringBuilder dbg) throws IllegalRawDataException, IOException { - - if (srhh.getSegmentsLeft() <= 0) { - ri.getDestlink().sendPacket(iPv6Packet, ri.getNexthop()); - } else { - if(reroute) { - - }else { - int newSL = srhh.getSegmentsLeft() - 1; - srhh.setSegmentsLeft(newSL); - iPv6Packet.setDestinationAddress(srhh.getAddresses().get(newSL)); - } - if(iPv6Packet.getPayload().getProtocolNumber()!=KLALBRoutingProtocol.DEFAULT_PROTOCOL_NUMBER) - klalbRouteProtol.putHotspotAddress(iPv6Packet.getSourceAddress()); - routePacket(iPv6Packet,reroute); + if (debug) { + dbg.append("----------------------------------------\n"); + dbg.append("packet:" + iPv6Packet.getSourceAddress().getHostAddress() + " -> " + + iPv6Packet.getDestinationAddress().getHostAddress() + "\n"); } + + List table = null; + IPv6RouteTableKey rk6= iPv6Packet.getDestinationRouteTableKey(); + // 最长前缀匹配搜索 + for(int i=128;i>=0;i--) { + rk6.applyMask(i); // 应用掩码 + table=routeTabel1.get(i).get(rk6); // 查找匹配的路由表 + if(table!=null) { + break; // 找到匹配 + } + } + + RouteItem prevr = null; + List routes = new ArrayList<>(); + + if(table ==null) { + return routes; // 无匹配路由 + } + + // 遍历路由表,筛选可用路由 + for (RouteItem tri : table) { + if (!tri.getDestlink().isUp()) { // 检查链路状态 + if (debug) { + dbg.append(tri + "\n"); + dbg.append("linkdown.\n"); + } + continue; // 跳过断开连接的链路 + } + if (debug) { + dbg.append(tri + "\n"); + dbg.append("matched.\n"); + } + // 检查ECMP(等价多路径)条件 + if (prevr != null) { + if (!tri.ECMPequals(prevr)) { + return routes; // 非ECMP路由,返回当前结果 + } + } + routes.add(tri); // 添加到可用路由列表 + prevr = tri; + } + return routes; } + + private ReentrantLock congressLock=new ReentrantLock(); // 拥塞锁 + private Condition congressCondition=congressLock.newCondition(); // 拥塞条件 + + // 负载均衡路由 + private boolean routingLoadBalance(IPv6Packet iPv6Packet, boolean reroute, StringBuilder dbg, + List routes) throws IllegalRawDataException, IOException { + + double cscale = 1.0; // 拥塞检测比例因子 + if (iPv6Packet.getPayload().getProtocolNumber() == 6) { // TCP协议 + cscale = 15.0; // TCP使用更高的拥塞检测阈值 + } + + if(iPv6Packet.getPreviousLink()!=null) { + List prev=new ArrayList<>(); + for (Iterator iterator = routes.iterator(); iterator.hasNext();) { + RouteItem routeItem = (RouteItem) iterator.next(); + if(routeItem.getDestlink().equals(iPv6Packet.getPreviousLink())) { + prev.add(routeItem); + iterator.remove(); + } + } + routes.addAll(prev); + } + for(double i=1;i<10;i+=0.1) { + if(loadBalance(iPv6Packet,reroute,dbg,routes,cscale*i,i==1)) { + return true; + } + + if (iPv6Packet.isEnableECN()) { // 启用ECN + iPv6Packet.markCE(); // 标记拥塞 + if (debug) { + dbg.append("ECN enabled.\n"); + } + } + } + System.out.println("Send failed:"+iPv6Packet); + if (debug) { + dbg.append("miss.\n"); // 路由失败 + } + return false; // 路由失败 + } + private boolean loadBalance(IPv6Packet iPv6Packet, boolean reroute, StringBuilder dbg, List routes, + double cscale, boolean checkSpeedLimit) throws IllegalRawDataException, IOException { + // 遍历可用路由进行负载均衡 + for (RouteItem tri : routes) { + IPv6NetworkLink link = tri.getDestlink(); + if (!link.isUp()) { // 检查链路状态 + if (debug) { + dbg.append(tri + "\n"); + dbg.append("linkdown.\n"); + } + continue; // 跳过断开链路 + } + if (link.isCongress(iPv6Packet, cscale)) { // 检查拥塞 + if (debug) { + dbg.append(tri + "\n"); + dbg.append("congress.\n"); + } + continue; // 跳过拥塞链路 + } + + if (link.isReachSpeedLimit(iPv6Packet)&&checkSpeedLimit) { // 检查速度限制 + if (debug) { + dbg.append(tri + "\n"); + dbg.append("reachspeedlimit.\n"); + } + continue; // 跳过达到限速的链路 + } + + if (debug) { + dbg.append(tri + "\n"); + dbg.append("matched.\n"); + } + // 找到可用链路,处理数据包 + processPacket(iPv6Packet, tri, reroute); + return true; + } + return false; + } + + // 处理数据包转发 + private void processPacket(IPv6Packet iPv6Packet, RouteItem ri, boolean reroute) + throws IllegalRawDataException, IOException { + int hop = iPv6Packet.getHopLimit(); + + if (ri.getDestlink().isLoopBack()) { // 环回链路处理 + IPv6SegmentRoutingHeader srhh = iPv6Packet.getSRHHeader(); + if (srhh != null) { + processSRv6Packet(iPv6Packet, ri, srhh, reroute); // SRv6特殊处理 + } else { + sendPacketToRouteItem(iPv6Packet, ri); + } + } else { // 普通链路处理 + // 检查重路由计数 + if (iPv6Packet.getRerouteCounter().getAndIncrement() >= MAX_REROUTE_COUNT) { + return; // 超过最大重路由次数,丢弃 + } + + if (!reroute) { + hop--; // 减少TTL(非重路由时) + } + + if (hop > 0) { // TTL有效 + iPv6Packet.setHopLimit(hop); // 更新TTL + sendPacketToRouteItem(iPv6Packet, ri); // 发送数据包 + } else { + sendTTLExceedPacket(iPv6Packet); // TTL超时 + } + } + } + + private void sendPacketToRouteItem(IPv6Packet iPv6Packet, RouteItem ri) throws IOException { + IPv6NetworkLink oldLink=iPv6Packet.getPreviousLink(); + /*if(oldLink!=null) { + System.out.println("重传:"+!oldLink.equals(ri.getDestlink())); + }*/ + //System.out.println(iPv6Packet.getHeaders()); + iPv6Packet.setPreviousLink(ri.getDestlink()); + ri.getDestlink().sendPacket(iPv6Packet, ri.getNexthop()); + } + + // 发送ICMP TTL超时消息 + private void sendTTLExceedPacket(IPv6Packet iPv6Packet) throws IOException, IllegalRawDataException { + // 构建IPv6数据包封装ICMP消息 + IPv6Packet icmpv = new IPv6Packet(); + icmpv.setSourceAddress(locator.getAddress()); + icmpv.setDestinationAddress(iPv6Packet.getSourceAddress()); + icmpv.setTrafficClass(iPv6Packet.getTrafficClass()); + icmpv.setVersion(6); + icmpv.setFlowLabel(0); + icmpv.setHopLimit(255); // ICMP消息TTL设为最大值 + ICMPv6TimeExceededPacket ipl = ICMPv6TimeExceededPacket.createHopLimitExceeded(iPv6Packet); + ipl.setParent(icmpv); + ipl.updateChecksum(); + icmpv.setPayload(ipl); + insertSRHandRoutePacket(icmpv); // 插入SRH并路由ICMP消息 + } + + // 处理SRv6数据包 + private void processSRv6Packet(IPv6Packet iPv6Packet, RouteItem ri, IPv6SegmentRoutingHeader srhh, boolean reroute) + throws IllegalRawDataException, IOException { + + if (srhh.getSegmentsLeft() <= 0) { // 所有段已处理完毕 + sendPacketToRouteItem(iPv6Packet, ri); + } else { + if (reroute) { + // 重路由处理 + } else { + // 正常SRv6处理:移动到下一个段 + int newSL = srhh.getSegmentsLeft() - 1; + srhh.setSegmentsLeft(newSL); // 更新剩余段数 + iPv6Packet.setDestinationAddress(srhh.getAddresses().get(newSL)); // 更新目的地址 + } + // 记录热点地址(用于流量工程) + if (iPv6Packet.getPayload().getProtocolNumber() != KLALBRoutingProtocol.DEFAULT_PROTOCOL_NUMBER) + klalbRouteProtol.putHotspotAddress(iPv6Packet.getSourceAddress()); + routePacket(iPv6Packet, reroute); // 继续路由 + } + } + + // 构造函数 public SRv6Router(Inet6AddressGroup hostAddress) { super(); this.locator = hostAddress; - //this.inLoopBackSRv6=new LoopbackIPv6NetworkLink(locator.getAddress()); - this.hostLoopBack= new LoopbackIPv6NetworkLink(hostAddress.getAddress()); - linkTabel.add(inLoopBack); - //linkTabel.add(inLoopBackSRv6); - linkTabel.add(hostLoopBack); + // 创建环回链路 + this.inLoopBack = new LoopbackIPv6NetworkLink(List.of(new Inet6AddressGroup(LOOPBACK_ADDRESS, 128) ,hostAddress),this); + linkTabel.add(inLoopBack); // 添加到链路表 } - /*public SRv6Router() { - super(); - linkTabel.add(inLoopBack); - }*/ - - private KLALBRoutingProtocol klalbRouteProtol = null; + private KLALBRoutingProtocol klalbRouteProtol = null; // KLALB路由协议实例 + // 启动KLALB路由协议 public void runKLALBRouteProtocol() { if (klalbRouteProtol != null) throw new IllegalStateException("KLALB routing protocol is already running!"); klalbRouteProtol = new KLALBRoutingProtocol(this); - klalbRouteProtol.start(); + klalbRouteProtol.start(); // 启动协议 } public KLALBRoutingProtocol getKlalbRouteProtol() { return klalbRouteProtol; } - private Map protocolNumberRegister = new ConcurrentHashMap<>(256*2); - - public Map getProtocolNumberRegister() { - return protocolNumberRegister; + public LoopbackIPv6NetworkLink getinLoopback() { + return inLoopBack; } - - /*public void putProtocolNumberPacketAndInsertSRHAsync(IPv6Packet pkt) { - // inLoopBack.getReceiveConsumer().accept(pkt); - srhReceive.accept(pkt); + // 获取邻居信息 + public List getNeighbors() { + List result=new ArrayList<>(); + Listlinks=getLinkTabel(); + Object[] nls=links.toArray(); + for(int i=0;ineis=nl.getNeighborsInfo(); + for (Iterator iteratorx = neis.iterator(); iteratorx.hasNext();) { + Neighbor addresses = (Neighbor) iteratorx.next(); + result.add(addresses); // 添加邻居信息 + } + } + } + return result; } - public void putProtocolNumberPacketAsync(IPv6Packet pkt) { - // inLoopBack.getReceiveConsumer().accept(pkt); - defaultReceive.accept(pkt); - }*/ -} + // 获取所有定位器 + public Set getLocators() { + Set result=new HashSet<>(); + Listlinks=getLinkTabel(); + Object[] nls=links.toArray(); + for(int i=0;ineis=nl.getNeighborsInfo(); + for (Iterator iteratorx = neis.iterator(); iteratorx.hasNext();) { + Neighbor addresses = (Neighbor) iteratorx.next(); + if(addresses.getLocator()!=null) + result.add(addresses.getLocator()); // 添加邻居定位器 + } + } + } + return result; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/srv6/SRv6RouterListener.java b/src/org/kne/cloud/network/srv6/SRv6RouterListener.java new file mode 100644 index 0000000..5679a6b --- /dev/null +++ b/src/org/kne/cloud/network/srv6/SRv6RouterListener.java @@ -0,0 +1,7 @@ +package org.kne.cloud.network.srv6; + +import org.kne.cloud.network.ipv6.IPv6NetworkLink; + +public interface SRv6RouterListener { + public void onLinkChanged(SRv6Router router,IPv6NetworkLink link) ; +} diff --git a/src/org/kne/cloud/network/tcp/TCPOptionTLV.java b/src/org/kne/cloud/network/tcp/TCPOptionTLV.java index a57e5a9..87fff9a 100644 --- a/src/org/kne/cloud/network/tcp/TCPOptionTLV.java +++ b/src/org/kne/cloud/network/tcp/TCPOptionTLV.java @@ -7,161 +7,251 @@ import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import org.kne.cloud.network.NetworkPacket; -import org.kne.cloud.network.klalb.KLALBPacket; +import org.kne.cloud.network.ipv6.TLV; -public class TCPOptionTLV extends NetworkPacket { - public static final int PAD1=0; - public static final int PADN=4; - public static final int HMAC=5; - public static final int SEQS=7; - public static final int ACKSEQS=8; - - private int headerLength=2; - - public int getHeaderLength() { - return headerLength; - } - - private boolean isDefault; - - protected volatile ByteBuffer header; - - private ByteBuffer data; - - public TCPOptionTLV(ByteBuffer header ) { - this(header,true); - } - - public ByteBuffer getData() { - return data; - } - - public TCPOptionTLV(ByteBuffer header ,boolean isDefault ) { - super(); - this.header = header; - this.isDefault=isDefault; - if(getType()==PAD1) - headerLength=1; - if(isDefault&&(headerLength>1)) { - data=ByteBuffer.allocate(512); - } - } - public TCPOptionTLV(int type) { - this(type,true); - } - public TCPOptionTLV(int type,boolean isDefault) { - super(); - this.header=ByteBuffer.allocate(2); - this.isDefault=isDefault; - header.put((byte) type); - if(type==PAD1) { - headerLength=1; - } - if(isDefault&&(headerLength>1)) { - data=ByteBuffer.allocate(512); - } - } - - @Override - public long getLength() { - return headerLength+(isDefault?data.limit():0); - } - - public static TCPOptionTLV readIPv6SegmentRoutingTLVFromChannel(ReadableByteChannel din) throws IOException { - ByteBuffer bbf= ByteBuffer.allocate(2); - bbf.limit(1); - while (bbf.hasRemaining()) { - if (din.read(bbf) == -1) { - return null; - } - } - int type=bbf.get(0)&0xff; - TCPOptionTLV rtlv; - switch(type) { - /*case PAD1: - rtlv=new PAD1SegmentRoutingTLV(bbf); - rtlv.readFromChannel(din); - return rtlv; - case PADN: - rtlv=new PADNSegmentRoutingTLV(bbf); - rtlv.readFromChannel(din); - return rtlv; - case SEQS: - rtlv=new SEQSSegmentRoutingTLV(bbf); - rtlv.readFromChannel(din); - return rtlv; - case ACKSEQS: - rtlv=new ACKSEQSSegmentRoutingTLV(bbf); - rtlv.readFromChannel(din); - return rtlv;*/ - default: - rtlv=new TCPOptionTLV(bbf); - rtlv.readFromChannel(din); - return rtlv; - } - } - public static void writeIPv6SegmentRoutingTLVToChannel(WritableByteChannel dto,TCPOptionTLV tlv) throws IOException { - tlv.writeToChannel(dto); - } - @Override - public void writeToChannel(WritableByteChannel dto) throws IOException { - if(isDefault&&(headerLength>1)) { - setDataLength(data.limit()); - } - header.limit(headerLength); - dto.write(header.slice(0,header.limit())); - if(isDefault&&(headerLength>1)) { - dto.write(data.slice(0, data.limit())); - } - } - - @Override - public void readFromChannel(ReadableByteChannel din, long length) throws IOException { - header.limit(1); - while (header.hasRemaining()) { - if (din.read(header) == -1) { - throw new EOFException(); - } - } - if(headerLength>1) { - header.limit(2); - while (header.hasRemaining()) { - if (din.read(header) == -1) { - throw new EOFException(); - } - } - } - header.flip(); - - if(isDefault&&(headerLength>1)) { - data.clear(); - data.limit(getDataLength()); - while(data.hasRemaining()){ - if(din.read(data)==-1) { - throw new EOFException(); - } - } - data.flip(); - } - } - - @Override - protected boolean needEndPosition() { - return false; - } - - public int getType() { - return header.get(0)&0xff; - } - public void setType(int type) { - header.put(0,(byte) type); - } - - public int getDataLength() { - return header.get(1)&0xff; - } - - public void setDataLength(int dataLength) { - header.put(1,(byte) dataLength); - } +/** + * TCP选项TLV基类 + * 遵循RFC 793和后续扩展的TCP选项格式 + */ +public class TCPOptionTLV extends TLV { + + /** + * 构造函数 - 从ByteBuffer创建 + */ + public TCPOptionTLV(ByteBuffer header, boolean isDefault) { + super(header, isDefault); + } + + /** + * 构造函数 - 指定类型创建 + */ + public TCPOptionTLV(int type, boolean isDefault) { + super(type, isDefault); + } + + /** + * 从通道读取TCP选项TLV + */ + public static TCPOptionTLV readTCPOptionTLVFromChannel(ReadableByteChannel din) throws IOException { + ByteBuffer typeBuffer = NetworkPacket.bufferAllocator.allocate(1); + typeBuffer.limit(1); + while (typeBuffer.hasRemaining()) { + if (din.read(typeBuffer) == -1) { + return null; + } + } + typeBuffer.flip(); + int type = typeBuffer.get(0) & 0xff; + + TCPOptionTLV tcpOption; + switch(type) { + case TCPEndOption.END_OF_OPTION_LIST: + tcpOption = new TCPEndOption(typeBuffer); + tcpOption.readFromChannel(din, 0); + return tcpOption; + case TCPNopOption.NO_OPERATION: + tcpOption = new TCPNopOption(typeBuffer); + tcpOption.readFromChannel(din, 0); + return tcpOption; + case TCPMssOption.MAXIMUM_SEGMENT_SIZE: + tcpOption = new TCPMssOption(typeBuffer); + tcpOption.readFromChannel(din, 0); + return tcpOption; + case TCPWindowScaleOption.WINDOW_SCALE: + tcpOption = new TCPWindowScaleOption(typeBuffer); + tcpOption.readFromChannel(din, 0); + return tcpOption; + case TCPSackPermittedOption.SACK_PERMITTED: + tcpOption = new TCPSackPermittedOption(typeBuffer); + tcpOption.readFromChannel(din, 0); + return tcpOption; + case TCPTimestampOption.TIMESTAMP: + tcpOption = new TCPTimestampOption(typeBuffer); + tcpOption.readFromChannel(din, 0); + return tcpOption; + default: + // 未知选项类型,按通用选项处理 + tcpOption = new TCPOptionTLV(typeBuffer, true); + tcpOption.readFromChannel(din, 0); + return tcpOption; + } + } + + /** + * 写入TCP选项TLV到通道 + */ + public static void writeTCPOptionTLVToChannel(WritableByteChannel dto, TCPOptionTLV tlv) throws IOException { + tlv.writeToChannel(dto); + } + + } + +/** + * End of Option List TCP选项 + */ +class TCPEndOption extends TCPOptionTLV { + public static final int END_OF_OPTION_LIST = 0; + + public TCPEndOption(ByteBuffer header) { + super(header, false); + setHeaderLength(1); // 单字节选项 + } + + @Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + // 单字节选项,不需要读取额外数据 + } + + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + // 只写入类型字节 + header.limit(1); + dto.write(header.slice(0, 1)); + } + + @Override + public long getTotalLength() { + return 1; + } +} + +/** + * No-Operation TCP选项 + */ +class TCPNopOption extends TCPOptionTLV { + public static final int NO_OPERATION = 1; + + public TCPNopOption(ByteBuffer header) { + super(header, false); + setHeaderLength(1); // 单字节选项 + } + + @Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + // 单字节选项,不需要读取额外数据 + } + + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + // 只写入类型字节 + header.limit(1); + dto.write(header.slice(0, 1)); + } + + @Override + public long getTotalLength() { + return 1; + } +} + +/** + * Maximum Segment Size TCP选项 + */ +class TCPMssOption extends TCPOptionTLV { + public static final int MAXIMUM_SEGMENT_SIZE = 2; + + public TCPMssOption(ByteBuffer header) { + super(header, true); + } + + public TCPMssOption(int mss) { + super(MAXIMUM_SEGMENT_SIZE, true); + setDataLength(2); + ByteBuffer dataBuffer = NetworkPacket.bufferAllocator.allocate(2); + dataBuffer.putShort((short) mss); + dataBuffer.flip(); + getData().put(dataBuffer); + } + + public int getMssValue() { + if (getData() != null && getData().remaining() >= 2) { + ByteBuffer duplicate = getData().duplicate(); + return duplicate.getShort() & 0xFFFF; + } + return 0; + } +} + +/** + * Window Scale TCP选项 + */ +class TCPWindowScaleOption extends TCPOptionTLV { + public static final int WINDOW_SCALE = 3; + + public TCPWindowScaleOption(ByteBuffer header) { + super(header, true); + } + + public TCPWindowScaleOption(int scaleFactor) { + super(WINDOW_SCALE, true); + setDataLength(1); + ByteBuffer dataBuffer = NetworkPacket.bufferAllocator.allocate(1); + dataBuffer.put((byte) scaleFactor); + dataBuffer.flip(); + getData().put(dataBuffer); + } + + public int getScaleFactor() { + if (getData() != null && getData().remaining() >= 1) { + ByteBuffer duplicate = getData().duplicate(); + return duplicate.get() & 0xFF; + } + return 0; + } +} + +/** + * SACK Permitted TCP选项 + */ +class TCPSackPermittedOption extends TCPOptionTLV { + public static final int SACK_PERMITTED = 4; + + public TCPSackPermittedOption(ByteBuffer header) { + super(header, true); + setDataLength(0); // 无数据部分 + } + + public TCPSackPermittedOption() { + super(SACK_PERMITTED, true); + setDataLength(0); // 无数据部分 + } +} + +/** + * Timestamp TCP选项 + */ +class TCPTimestampOption extends TCPOptionTLV { + public static final int TIMESTAMP = 8; + + public TCPTimestampOption(ByteBuffer header) { + super(header, true); + } + + public TCPTimestampOption(int tsValue, int tsEchoReply) { + super(TIMESTAMP, true); + setDataLength(8); + ByteBuffer dataBuffer = NetworkPacket.bufferAllocator.allocate(8); + dataBuffer.putInt(tsValue); + dataBuffer.putInt(tsEchoReply); + dataBuffer.flip(); + getData().put(dataBuffer); + } + + public long getTimestampValue() { + if (getData() != null && getData().remaining() >= 8) { + ByteBuffer duplicate = getData().duplicate(); + return duplicate.getInt() & 0xFFFFFFFFL; + } + return 0; + } + + public long getTimestampEchoReply() { + if (getData() != null && getData().remaining() >= 8) { + ByteBuffer duplicate = getData().duplicate(); + duplicate.position(4); + return duplicate.getInt() & 0xFFFFFFFFL; + } + return 0; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/tcp/TCPPacket.java b/src/org/kne/cloud/network/tcp/TCPPacket.java index 81967b4..63f1132 100644 --- a/src/org/kne/cloud/network/tcp/TCPPacket.java +++ b/src/org/kne/cloud/network/tcp/TCPPacket.java @@ -1,191 +1,476 @@ package org.kne.cloud.network.tcp; +import java.io.EOFException; +import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; import java.util.ArrayList; import java.util.List; import org.kne.cloud.network.NetworkPacket; import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload; -public class TCPPacket extends IPv6Payload{ - private ByteBuffer header=NetworkPacket.bufferAllocator.allocate(20); - - private Listoptions=new ArrayList(); - - public TCPPacket() { - super(6,false); - } - - public int getSrcPort() { - return header.getChar(0); - } - - public void setSrcPort(int srcPort) { - header.putChar(0, (char) srcPort); - } - - public int getDstPort() { - return header.getChar(2); - } - - public void setDstPort(int dstPort) { - header.putChar(2, (char) dstPort); - } - - public long getSeqNumber() { - return header.getInt(4)&0xffffffff; - } - - public void setSeqNumber(long seqNumber) { - header.putInt(4,(int) seqNumber); - } - - public long getAckNumber() { - return header.getInt(8)&0xffffffff; - } - - public void setAckNumber(long ackNumber) { - header.putInt(8,(int) ackNumber); - } - - public int getHeaderLength() { - return (header.get(12)>>>4)&0b1111; - } - - public void setHeaderLength(int headerLength) { - header.put(12, (byte) ((header.get(12)&0b00001111)|((headerLength&0b1111)<<4))); - } - - - public boolean isNS() { - return (header.get(12)&1)!=0; - } - - public void setNS(boolean ns) { - if(ns) { - header.put(12,(byte) (header.get(12)|0b00000001)); - }else { - header.put(12,(byte) (header.get(12)&0b11111110)); - } - } - - public boolean isCWR() { - return (header.get(13)&0b10000000)!=0; - } - - public void setCWR(boolean cwr) { - if(cwr) { - header.put(13,(byte) (header.get(13)|0b10000000)); - }else { - header.put(13,(byte) (header.get(13)&0b01111111)); - } - } - - public boolean isECE() { - return (header.get(13)&0b01000000)!=0; - } - - public void setECE(boolean ece) { - if(ece) { - header.put(13,(byte) (header.get(13)|0b01000000)); - }else { - header.put(13,(byte) (header.get(13)&0b10111111)); - } - } - - public boolean isURG() { - return (header.get(13)&0b00100000)!=0; - } - - public void setURG(boolean urg) { - if(urg) { - header.put(13,(byte) (header.get(13)|0b00100000)); - }else { - header.put(13,(byte) (header.get(13)&0b11011111)); - } - } - - public boolean isACK() { - return (header.get(13)&0b00010000)!=0; - } - - public void setACK(boolean ack) { - if(ack) { - header.put(13,(byte) (header.get(13)|0b00010000)); - }else { - header.put(13,(byte) (header.get(13)&0b11101111)); - } - } - - public boolean isPSH() { - return (header.get(13)&0b00001000)!=0; - } - - public void setPSH(boolean psh) { - if(psh) { - header.put(13,(byte) (header.get(13)|0b00001000)); - }else { - header.put(13,(byte) (header.get(13)&0b11110111)); - } - } - - public boolean isRST() { - return (header.get(13)&0b00000100)!=0; - } - - public void setRST(boolean psh) { - if(psh) { - header.put(13,(byte) (header.get(13)|0b00000100)); - }else { - header.put(13,(byte) (header.get(13)&0b11111011)); - } - } - - public boolean isSYN() { - return (header.get(13)&0b00000010)!=0; - } - - public void setSYN(boolean syn) { - if(syn) { - header.put(13,(byte) (header.get(13)|0b00000010)); - }else { - header.put(13,(byte) (header.get(13)&0b11111101)); - } - } - - public boolean isFIN() { - return (header.get(13)&0b00000001)!=0; - } - - public void setFIN(boolean fin) { - if(fin) { - header.put(13,(byte) (header.get(13)|0b00000001)); - }else { - header.put(13,(byte) (header.get(13)&0b11111110)); - } - } - - public int getWindowSize() { - return header.getChar(14); - } - - public void setWindowSize(int windowSize) { - header.putChar(14,(char) windowSize); - } - - public int getCheckSum() { - return header.getChar(16); - } - - public void setCheckSum(int checkSum) { - header.putChar(16,(char) checkSum); - } - - public int getUrgentPointer() { - return header.getChar(18); - } - - public void setUrgentPointer(int urgentPointer) { - header.putChar(18,(char) urgentPointer); - } -} +public class TCPPacket extends IPv6Payload { + public static final int TCP_PROTOCOL_NUMBER = 6; + + // TCP头部常量 + private static final int TCP_HEADER_MIN_LENGTH = 20; + private static final int TCP_OPTIONS_MAX_LENGTH = 40; + + // TCP标志位掩码 + private static final int FLAG_NS = 0x100; + private static final int FLAG_CWR = 0x80; + private static final int FLAG_ECE = 0x40; + private static final int FLAG_URG = 0x20; + private static final int FLAG_ACK = 0x10; + private static final int FLAG_PSH = 0x08; + private static final int FLAG_RST = 0x04; + private static final int FLAG_SYN = 0x02; + private static final int FLAG_FIN = 0x01; + + private ByteBuffer header = NetworkPacket.bufferAllocator.allocate(TCP_HEADER_MIN_LENGTH); + private List options = new ArrayList<>(); + + public TCPPacket() { + super(TCP_PROTOCOL_NUMBER, false); + // 设置默认数据偏移量(头部长度) + setDataOffset(5); // 5 * 4 = 20字节 + } + + // ==================== 端口相关方法 ==================== + + public int getSrcPort() { + return header.getShort(0) & 0xFFFF; + } + + public void setSrcPort(int srcPort) { + if (srcPort < 0 || srcPort > 65535) { + throw new IllegalArgumentException("Source port must be between 0 and 65535"); + } + header.putShort(0, (short) srcPort); + } + + public int getDstPort() { + return header.getShort(2) & 0xFFFF; + } + + public void setDstPort(int dstPort) { + if (dstPort < 0 || dstPort > 65535) { + throw new IllegalArgumentException("Destination port must be between 0 and 65535"); + } + header.putShort(2, (short) dstPort); + } + + // ==================== 序列号相关方法 ==================== + + public long getSeqNumber() { + return header.getInt(4) & 0xFFFFFFFFL; + } + + public void setSeqNumber(long seqNumber) { + if (seqNumber < 0 || seqNumber > 0xFFFFFFFFL) { + throw new IllegalArgumentException("Sequence number must be between 0 and 2^32-1"); + } + header.putInt(4, (int) seqNumber); + } + + public long getAckNumber() { + return header.getInt(8) & 0xFFFFFFFFL; + } + + public void setAckNumber(long ackNumber) { + if (ackNumber < 0 || ackNumber > 0xFFFFFFFFL) { + throw new IllegalArgumentException("Acknowledgment number must be between 0 and 2^32-1"); + } + header.putInt(8, (int) ackNumber); + } + + // ==================== 数据偏移和保留位 ==================== + + public int getDataOffset() { + return (header.get(12) >>> 4) & 0x0F; + } + + public void setDataOffset(int dataOffset) { + if (dataOffset < 5 || dataOffset > 15) { + throw new IllegalArgumentException("Data offset must be between 5 and 15"); + } + header.put(12, (byte) ((header.get(12) & 0x0F) | ((dataOffset & 0x0F) << 4))); + } + + public boolean isNS() { + return (header.get(12) & 0x01) != 0; + } + + public void setNS(boolean ns) { + if (ns) { + header.put(12, (byte) (header.get(12) | 0x01)); + } else { + header.put(12, (byte) (header.get(12) & 0xFE)); + } + } + + // ==================== 标志位方法 ==================== + + public int getFlags() { + return header.get(13) & 0xFF; + } + + public void setFlags(int flags) { + header.put(13, (byte) flags); + } + + public boolean isCWR() { + return (getFlags() & FLAG_CWR) != 0; + } + + public void setCWR(boolean cwr) { + setFlag(FLAG_CWR, cwr); + } + + public boolean isECE() { + return (getFlags() & FLAG_ECE) != 0; + } + + public void setECE(boolean ece) { + setFlag(FLAG_ECE, ece); + } + + public boolean isURG() { + return (getFlags() & FLAG_URG) != 0; + } + + public void setURG(boolean urg) { + setFlag(FLAG_URG, urg); + } + + public boolean isACK() { + return (getFlags() & FLAG_ACK) != 0; + } + + public void setACK(boolean ack) { + setFlag(FLAG_ACK, ack); + } + + public boolean isPSH() { + return (getFlags() & FLAG_PSH) != 0; + } + + public void setPSH(boolean psh) { + setFlag(FLAG_PSH, psh); + } + + public boolean isRST() { + return (getFlags() & FLAG_RST) != 0; + } + + public void setRST(boolean rst) { + setFlag(FLAG_RST, rst); + } + + public boolean isSYN() { + return (getFlags() & FLAG_SYN) != 0; + } + + public void setSYN(boolean syn) { + setFlag(FLAG_SYN, syn); + } + + public boolean isFIN() { + return (getFlags() & FLAG_FIN) != 0; + } + + public void setFIN(boolean fin) { + setFlag(FLAG_FIN, fin); + } + + private void setFlag(int flag, boolean set) { + int flags = getFlags(); + if (set) { + flags |= flag; + } else { + flags &= ~flag; + } + setFlags(flags); + } + + // ==================== 窗口大小 ==================== + + public int getWindowSize() { + return header.getShort(14) & 0xFFFF; + } + + public void setWindowSize(int windowSize) { + if (windowSize < 0 || windowSize > 65535) { + throw new IllegalArgumentException("Window size must be between 0 and 65535"); + } + header.putShort(14, (short) windowSize); + } + + // ==================== 校验和 ==================== + + public int getChecksum() { + return header.getShort(16) & 0xFFFF; + } + + public void setChecksum(int checksum) { + header.putShort(16, (short) checksum); + } + + // ==================== 紧急指针 ==================== + + public int getUrgentPointer() { + return header.getShort(18) & 0xFFFF; + } + + public void setUrgentPointer(int urgentPointer) { + if (urgentPointer < 0 || urgentPointer > 65535) { + throw new IllegalArgumentException("Urgent pointer must be between 0 and 65535"); + } + header.putShort(18, (short) urgentPointer); + } + + // ==================== 选项处理 ==================== + + public List getOptions() { + return new ArrayList<>(options); + } + + public void addOption(TCPOptionTLV option) { + options.add(option); + } + + public void removeOption(TCPOptionTLV option) { + options.remove(option); + } + + public TCPOptionTLV findOptionByType(int type) { + for (TCPOptionTLV option : options) { + if (option.getType() == type) { + return option; + } + } + return null; + } + + /** + * 添加MSS选项 + */ + public void addMssOption(int mss) { + addOption(new TCPMssOption(mss)); + } + + /** + * 获取MSS值 + */ + public int getMssValue() { + TCPMssOption mssOption = (TCPMssOption) findOptionByType(TCPMssOption.MAXIMUM_SEGMENT_SIZE); + return mssOption != null ? mssOption.getMssValue() : 0; + } + + /** + * 添加窗口缩放选项 + */ + public void addWindowScaleOption(int scaleFactor) { + addOption(new TCPWindowScaleOption(scaleFactor)); + } + + /** + * 获取窗口缩放因子 + */ + public int getWindowScaleValue() { + TCPWindowScaleOption scaleOption = (TCPWindowScaleOption) findOptionByType(TCPWindowScaleOption.WINDOW_SCALE); + return scaleOption != null ? scaleOption.getScaleFactor() : 0; + } + + /** + * 添加SACK允许选项 + */ + public void addSackPermittedOption() { + addOption(new TCPSackPermittedOption()); + } + + /** + * 添加时间戳选项 + */ + public void addTimestampOption(int tsValue, int tsEchoReply) { + addOption(new TCPTimestampOption(tsValue, tsEchoReply)); + } + + /** + * 获取时间戳值 + */ + public long getTimestampValue() { + TCPTimestampOption tsOption = (TCPTimestampOption) findOptionByType(TCPTimestampOption.TIMESTAMP); + return tsOption != null ? tsOption.getTimestampValue() : 0; + } + + /** + * 获取时间戳回显值 + */ + public long getTimestampEchoReply() { + TCPTimestampOption tsOption = (TCPTimestampOption) findOptionByType(TCPTimestampOption.TIMESTAMP); + return tsOption != null ? tsOption.getTimestampEchoReply() : 0; + } + + // ==================== 数据部分处理 ==================== + + @Override + public long getTotalLength() { + int headerLength = TCP_HEADER_MIN_LENGTH + calculateOptionsLength(); + return headerLength + (getData() != null ? getData().limit() : 0); + } + + public int getPayloadLength() { + return getData() != null ? getData().limit() : 0; + } + + // ==================== 网络读写方法 ==================== + + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + // 写入TCP基本头部(20字节) + header.position(0); + header.limit(TCP_HEADER_MIN_LENGTH); + dto.write(header); + + // 写入TCP选项 + for (TCPOptionTLV option : options) { + TCPOptionTLV.writeTCPOptionTLVToChannel(dto, option); + } + + // 写入选项填充(如果需要) + int optionsLength = calculateOptionsLength(); + int paddingNeeded = (4 - (optionsLength % 4)) % 4; + for (int i = 0; i < paddingNeeded; i++) { + ByteBuffer nop = ByteBuffer.allocate(1); + nop.put((byte) TCPNopOption.NO_OPERATION); + nop.flip(); + dto.write(nop); + } + + // 写入TCP数据负载 + if (getData() != null && getData().limit() > 0) { + getData().position(0); + dto.write(getData()); + } + } + + @Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + // 读取TCP基本头部(20字节) + header.clear(); + header.limit(TCP_HEADER_MIN_LENGTH); + while (header.hasRemaining()) { + if (din.read(header) == -1) { + throw new EOFException(); + } + } + header.flip(); + + // 计算TCP头部总长度和选项长度 + int headerLength = getDataOffset() * 4; + int optionsLength = headerLength - TCP_HEADER_MIN_LENGTH; + + if (headerLength < TCP_HEADER_MIN_LENGTH || headerLength > (TCP_HEADER_MIN_LENGTH + TCP_OPTIONS_MAX_LENGTH)) { + throw new IOException("Invalid TCP header length: " + headerLength); + } + + // 读取TCP选项 + options.clear(); + if (optionsLength > 0) { + readOptionsFromChannel(din, optionsLength); + } + + // 读取TCP数据负载 + int payloadLength = (int) length - headerLength; + if (payloadLength > 0) { + if (getData() == null) { + // setData(NetworkPacket.bufferAllocator.allocate(payloadLength)); + } + getData().clear(); + getData().limit(payloadLength); + while (getData().hasRemaining()) { + if (din.read(getData()) == -1) { + throw new EOFException(); + } + } + getData().flip(); + } + } + + /** + * 从通道读取TCP选项 + */ + private void readOptionsFromChannel(ReadableByteChannel din, int optionsLength) throws IOException { + int bytesRead = 0; + + while (bytesRead < optionsLength) { + TCPOptionTLV option = TCPOptionTLV.readTCPOptionTLVFromChannel(din); + if (option == null) { + break; + } + + bytesRead += option.getTotalLength(); + options.add(option); + + // 如果遇到End选项,停止读取 + if (option.getType() == TCPEndOption.END_OF_OPTION_LIST) { + break; + } + } + + // 跳过剩余的选项字节(如果有) + int remaining = optionsLength - bytesRead; + if (remaining > 0) { + ByteBuffer skipBuffer = NetworkPacket.bufferAllocator.allocate(remaining); + skipBuffer.limit(remaining); + while (skipBuffer.hasRemaining()) { + if (din.read(skipBuffer) == -1) { + throw new EOFException(); + } + } + } + } + + // ==================== 辅助方法 ==================== + + private int calculateOptionsLength() { + int total = 0; + for (TCPOptionTLV option : options) { + total += (int) option.getTotalLength(); + } + return total; + } + + // ==================== 工具方法 ==================== + + @Override + public String toString() { + return String.format( + "TCPPacket[srcPort=%d, dstPort=%d, seq=%d, ack=%d, flags=%s, window=%d, options=%d, payload=%d bytes]", + getSrcPort(), getDstPort(), getSeqNumber(), getAckNumber(), getFlagsString(), + getWindowSize(), options.size(), getPayloadLength() + ); + } + + private String getFlagsString() { + StringBuilder sb = new StringBuilder(); + if (isFIN()) sb.append("FIN "); + if (isSYN()) sb.append("SYN "); + if (isRST()) sb.append("RST "); + if (isPSH()) sb.append("PSH "); + if (isACK()) sb.append("ACK "); + if (isURG()) sb.append("URG "); + if (isECE()) sb.append("ECE "); + if (isCWR()) sb.append("CWR "); + if (isNS()) sb.append("NS "); + return sb.toString().trim(); + } + + @Override + protected boolean needEndPosition() { + return true; + } +} \ No newline at end of file diff --git a/src/org/kne/cloud/network/tcp/UDPPacket.java b/src/org/kne/cloud/network/tcp/UDPPacket.java new file mode 100644 index 0000000..78caff0 --- /dev/null +++ b/src/org/kne/cloud/network/tcp/UDPPacket.java @@ -0,0 +1,218 @@ +package org.kne.cloud.network.tcp; + +import java.io.EOFException; +import java.io.IOException; +import java.net.Inet6Address; +import java.net.UnknownHostException; +import java.nio.ByteBuffer; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.util.Arrays; + +import org.kne.cloud.network.NetworkPacket; +import org.kne.cloud.network.ipv6.IPv6Packet; +import org.kne.cloud.network.ipv6.IPv6Packet.IPv6Payload; +import org.kne.cloud.network.klalb.PortPacket; +import org.kne.io.KNEChannels; + +public class UDPPacket extends IPv6Payload implements PortPacket { + public static final int UDP_PROTOCOL_NUMBER = 17; + public static final int UDP_HEADER_LENGTH = 8; // UDP头部固定8字节 + + private ByteBuffer header = NetworkPacket.bufferAllocator.allocate(UDP_HEADER_LENGTH); + private ByteBuffer data; + + public UDPPacket() { + super(UDP_PROTOCOL_NUMBER, false); + } + + public UDPPacket(int srcPort,int dstPort) { + super(UDP_PROTOCOL_NUMBER, false); + header.putChar((char) srcPort); + header.putChar((char) dstPort); + data = NetworkPacket.bufferAllocator.allocate(65535); + + } + + @Override + public long getTotalLength() { + return data.limit()+UDP_HEADER_LENGTH; + } + + + @Override + public void writeToChannel(WritableByteChannel dto) throws IOException { + setUDPLength(getDataLength() + UDP_HEADER_LENGTH); // 设置总长度(头+数据) + dto.write(header.slice(0, UDP_HEADER_LENGTH)); + dto.write(data.slice(0, data.limit())); + } + + @Override + public void readFromChannel(ReadableByteChannel din, long length) throws IOException { + header.clear().limit(UDP_HEADER_LENGTH); + KNEChannels.readFully(din, header); + + // 读取数据部分(总长度减去头部长度) + int totalLength = getUDPLength(); + int dataLength = totalLength - UDP_HEADER_LENGTH; + + if (dataLength < 0) { + throw new IOException("Invalid UDP packet: total length < header length"); + } + + data = NetworkPacket.bufferAllocator.allocate(dataLength); + KNEChannels.readFully(din, data); + data.flip(); + } + + @Override + protected boolean needEndPosition() { + return false; + } + + public int getSrcPort() { + return header.getChar(0); + } + + public void setSrcPort(int srcPort) { + header.putChar(0, (char) srcPort); + } + + public int getDstPort() { + return header.getChar(2); + } + + public void setDstPort(int dstPort) { + header.putChar(2, (char) dstPort); + } + + /** + * 获取UDP数据包总长度(头部+数据) + */ + public int getUDPLength() { + return header.getChar(4); + } + + /** + * 设置UDP数据包总长度(头部+数据) + */ + public void setUDPLength(int totalLength) { + header.putChar(4, (char) totalLength); + } + + /** + * 获取数据部分长度(不包含头部) + */ + public int getDataLength() { + return data != null ? data.limit() : 0; + } + + public int getChecksum() { + return header.getChar(6); + } + + public void setChecksum(int checksum) { + header.putChar(6, (char) checksum); + } + + public ByteBuffer getData() { + return data; + } + + public int calculateChecksum() { + if (getParent() == null) { + throw new IllegalStateException("Parent IPv6 packet required for checksum calculation"); + } + + // 保存原始校验和值 + int originalChecksum = getChecksum(); + + try { + // 临时将校验和字段设为0 + setChecksum(0); + + long sum = 0; + + // IPv6伪首部 + byte[] srcAddr = new byte[16], dstAddr = new byte[16]; + getParent().getRawSourceAddress(srcAddr); + getParent().getRawDestinationAddress(dstAddr); + + for (int i = 0; i < 16; i += 2) { + sum += ((srcAddr[i] & 0xFF) << 8) | (srcAddr[i + 1] & 0xFF); + sum += ((dstAddr[i] & 0xFF) << 8) | (dstAddr[i + 1] & 0xFF); + } + + // 使用总长度(头部+数据) + int totalLength = getUDPLength(); + sum += (totalLength >>> 16) + totalLength; + sum += UDP_PROTOCOL_NUMBER; + + // UDP首部(此时校验和字段为0) + ByteBuffer headerCopy = header.duplicate(); + headerCopy.position(0).limit(UDP_HEADER_LENGTH); + while (headerCopy.remaining() >= 2) { + sum += headerCopy.getChar(); + } + + // UDP数据 + if (data != null && data.limit() > 0) { + ByteBuffer dataCopy = data.duplicate(); + dataCopy.position(0); + + while (dataCopy.remaining() >= 2) { + sum += dataCopy.getChar(); + } + + if (dataCopy.remaining() == 1) { + sum += (dataCopy.get() & 0xFF) << 8; + } + } + + // 折叠进位并取反 + while ((sum >> 16) != 0) { + sum = (sum & 0xFFFF) + (sum >> 16); + } + + int checksum = (int) (~sum & 0xFFFF); + return checksum == 0 ? 0xFFFF : checksum; + + } finally { + // 恢复原始校验和值 + setChecksum(originalChecksum); + } + } + + public void updateChecksum() { + setChecksum(calculateChecksum()); + } + + public boolean verifyChecksum() { + int storedChecksum = getChecksum(); + return storedChecksum == 0 || storedChecksum == calculateChecksum(); + } + + @Override + public String toString() { + byte[] b = new byte[Math.min(data.limit(), 10)]; + data.get(0, b); + return "UDP " + getSrcPort() + "->" + getDstPort() + " [Total:" + getUDPLength() + + ", Data:" + getDataLength() + "] " + Arrays.toString(b); + } + public static void main(String[] args) throws UnknownHostException { + UDPPacket udp=new UDPPacket(1234,1234); + udp.getData().put((byte) 234); + udp.getData().flip(); + IPv6Packet ipv=new IPv6Packet(); + ipv.setSourceAddress((Inet6Address) Inet6Address.getByName("::1")); + ipv.setDestinationAddress((Inet6Address) Inet6Address.getByName("::2")); + udp.setParent(ipv); + System.out.println(udp.calculateChecksum()); + udp.setChecksum(1); + System.out.println(udp.verifyChecksum()); + udp.updateChecksum(); + System.out.println(udp.verifyChecksum()); + } + + +} \ No newline at end of file diff --git a/src/org/kne/io/KNEChannels.java b/src/org/kne/io/KNEChannels.java index 2256589..0af9eb9 100644 --- a/src/org/kne/io/KNEChannels.java +++ b/src/org/kne/io/KNEChannels.java @@ -2,6 +2,7 @@ package org.kne.io; import java.io.EOFException; import java.io.IOException; +import java.nio.BufferOverflowException; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; import java.nio.channels.SocketChannel; @@ -33,7 +34,11 @@ public class KNEChannels { int opos=src.position(); //System.out.println(bbf+" "+src); //FastLib .bufferPut(bbf,src); + try { bbf.put(src); + }catch(BufferOverflowException e) { + throw new IOException(src.toString()+" "+bbf.toString(), e); + } return src.position()-opos; } }