From 6395e27cdf1eee95704d275205669f3463eabdae Mon Sep 17 00:00:00 2001 From: garciay Date: Fri, 7 Oct 2016 08:00:36 +0000 Subject: [PATCH] Import Pcap Capture tool on file --- tools/.classpath | 7 + tools/.project | 17 + tools/.settings/org.eclipse.jdt.core.prefs | 11 + tools/PcapDump.bat | 19 + tools/PcapDump.jardesc | 16 + tools/bin/org/etsi/common/ByteHelper.class | Bin 0 -> 6569 bytes tools/bin/org/etsi/common/ITuple.class | Bin 0 -> 277 bytes tools/bin/org/etsi/common/KPM.class | Bin 0 -> 899 bytes tools/bin/org/etsi/common/Tuple.class | Bin 0 -> 948 bytes ...neParser$IllegalOptionValueException.class | Bin 0 -> 1530 bytes .../CmdLineParser$NotFlagException.class | Bin 0 -> 1131 bytes .../CmdLineParser$Option$BooleanOption.class | Bin 0 -> 737 bytes .../CmdLineParser$Option$DoubleOption.class | Bin 0 -> 1625 bytes .../CmdLineParser$Option$IntegerOption.class | Bin 0 -> 1313 bytes .../CmdLineParser$Option$LongOption.class | Bin 0 -> 1301 bytes .../CmdLineParser$Option$StringOption.class | Bin 0 -> 920 bytes .../its/pcapdump/CmdLineParser$Option.class | Bin 0 -> 2381 bytes .../CmdLineParser$OptionException.class | Bin 0 -> 489 bytes ...CmdLineParser$UnknownOptionException.class | Bin 0 -> 1095 bytes ...LineParser$UnknownSuboptionException.class | Bin 0 -> 1127 bytes .../org/etsi/its/pcapdump/CmdLineParser.class | Bin 0 -> 6525 bytes tools/bin/org/etsi/its/pcapdump/ILayer.class | Bin 0 -> 184 bytes .../etsi/its/pcapdump/PcapMultiplexer$1.class | Bin 0 -> 1563 bytes .../etsi/its/pcapdump/PcapMultiplexer.class | Bin 0 -> 5108 bytes .../bin/org/etsi/its/pcapdump/pcapdump.class | Bin 0 -> 5223 bytes tools/itsdump.pcapng | Bin 0 -> 40740 bytes tools/itsdump.pcapng_1475823029887 | Bin 0 -> 24 bytes tools/lib/PcapDump.jar | Bin 0 -> 24430 bytes tools/src/org/etsi/common/ByteHelper.java | 284 +++++++++ tools/src/org/etsi/common/ITuple.java | 25 + tools/src/org/etsi/common/KPM.java | 61 ++ tools/src/org/etsi/common/Tuple.java | 52 ++ .../org/etsi/its/pcapdump/CmdLineParser.java | 568 ++++++++++++++++++ tools/src/org/etsi/its/pcapdump/ILayer.java | 9 + .../etsi/its/pcapdump/PcapMultiplexer.java | 171 ++++++ tools/src/org/etsi/its/pcapdump/pcapdump.java | 188 ++++++ 36 files changed, 1428 insertions(+) create mode 100644 tools/.classpath create mode 100644 tools/.project create mode 100644 tools/.settings/org.eclipse.jdt.core.prefs create mode 100644 tools/PcapDump.bat create mode 100644 tools/PcapDump.jardesc create mode 100644 tools/bin/org/etsi/common/ByteHelper.class create mode 100644 tools/bin/org/etsi/common/ITuple.class create mode 100644 tools/bin/org/etsi/common/KPM.class create mode 100644 tools/bin/org/etsi/common/Tuple.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$IllegalOptionValueException.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$NotFlagException.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$Option$BooleanOption.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$Option$DoubleOption.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$Option$IntegerOption.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$Option$LongOption.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$Option$StringOption.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$Option.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$OptionException.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$UnknownOptionException.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser$UnknownSuboptionException.class create mode 100644 tools/bin/org/etsi/its/pcapdump/CmdLineParser.class create mode 100644 tools/bin/org/etsi/its/pcapdump/ILayer.class create mode 100644 tools/bin/org/etsi/its/pcapdump/PcapMultiplexer$1.class create mode 100644 tools/bin/org/etsi/its/pcapdump/PcapMultiplexer.class create mode 100644 tools/bin/org/etsi/its/pcapdump/pcapdump.class create mode 100644 tools/itsdump.pcapng create mode 100644 tools/itsdump.pcapng_1475823029887 create mode 100644 tools/lib/PcapDump.jar create mode 100644 tools/src/org/etsi/common/ByteHelper.java create mode 100644 tools/src/org/etsi/common/ITuple.java create mode 100644 tools/src/org/etsi/common/KPM.java create mode 100644 tools/src/org/etsi/common/Tuple.java create mode 100644 tools/src/org/etsi/its/pcapdump/CmdLineParser.java create mode 100644 tools/src/org/etsi/its/pcapdump/ILayer.java create mode 100644 tools/src/org/etsi/its/pcapdump/PcapMultiplexer.java create mode 100644 tools/src/org/etsi/its/pcapdump/pcapdump.java diff --git a/tools/.classpath b/tools/.classpath new file mode 100644 index 000000000..205625cc4 --- /dev/null +++ b/tools/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tools/.project b/tools/.project new file mode 100644 index 000000000..cee79a6d9 --- /dev/null +++ b/tools/.project @@ -0,0 +1,17 @@ + + + pcapdump + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/tools/.settings/org.eclipse.jdt.core.prefs b/tools/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..bb35fa0a8 --- /dev/null +++ b/tools/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/tools/PcapDump.bat b/tools/PcapDump.bat new file mode 100644 index 000000000..1fd507d79 --- /dev/null +++ b/tools/PcapDump.bat @@ -0,0 +1,19 @@ +@echo "Starting PcapDump..." +@title PcapDump + +@set JAVA_PATH=C:\Program Files\Java\jre1.8.0_101\bin +@rem set BASE_PATH=C:\Users\garciay\Documents\ETSI\ITS + +@rem Home laptop +@rem set JAVA_PATH=C:\Program Files\Java\jre1.8.0_101\bin +@rem set JAVA_PATH=C:\Program Files (x86)\Java\jre8\bin +@set BASE_PATH=F:\FSCOM\ETSI\ITS + +@set LOG_PATH=%BASE_PATH%\STF517_ITS_Valid_Conform_Frmwk.2016\workspace_eclipse\pcapdump\lib +@set CODEC_PATH=%LOG_PATH%\PcapDump.jar +@set JNETPCAP_PATH=%BASE_PATH%\STF517_ITS_Valid_Conform_Frmwk.2016\workspace_ttwb\STF517\tt3plugins\EtsiItsAdapter\jnetpcap-1.4.r1425\jnetpcap.jar + +@"%JAVA_PATH%\java.exe" -cp "%CODEC_PATH%;%JNETPCAP_PATH%" org.etsi.its.pcapdump.pcapdump +@rem --FileName yann.pcap --NicAddr 00FF6BADBFC2 --FrameType=8947 +@rem pause + diff --git a/tools/PcapDump.jardesc b/tools/PcapDump.jardesc new file mode 100644 index 000000000..dcec9a4d0 --- /dev/null +++ b/tools/PcapDump.jardesc @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/tools/bin/org/etsi/common/ByteHelper.class b/tools/bin/org/etsi/common/ByteHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..fef8374559dfe286e98db182ae2f3117f222e892 GIT binary patch literal 6569 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 a2IRAYcnlmsJ|_~N3n<17mf?Y_-~|9TUqAf- literal 0 HcmV?d00001 diff --git a/tools/bin/org/etsi/common/KPM.class b/tools/bin/org/etsi/common/KPM.class new file mode 100644 index 0000000000000000000000000000000000000000..f8a5f2fe8af3c9e3b8e7ab6982bea5fd1fd3f69b GIT binary patch literal 899 zcmZuv%T7~K6kX@O`k<6by%eOChl!!LDHW=X0bzg%v9VAigoMeXVF-+r z+@`bHJKS?R+xA|=5g0ACs&-???zl3(zSO)oZdbr8{b%&DK)`L*ocHB@fzVuKtyrwA zrHf$*+=^fnae*j-wtJqlZo7?MheHger7J}Os@a|`pj6fb^sZ-jh*`+{uGea_aohGh zr_-dje^aZ-I#K7}6&T*~?CRSMyX^xFU{WBw)#`Ps&blkv1gXuulm#=yqf$lCauy8Q z0HYjF!Be+BBlwAqf-tRo2E8HL$RL5|FryHn7~u_z#Tc8(CJpO50@)wXmGkTu#FjL* zpidTzGi*+1rmofI3%aQvBat=re9ZcQsB|pT$e&#O{`U^XkuFR<+dsjOX=M8~?e+PQ zAxtBAdi7N~=RDQNxJX2RNk4%YCJ@IYZ3?qUVi{8?V;V0R?cyG6zSVKx=ksiU8Mj$0 ze+`VWgXG)5I6cMpCitqd?CY3B7sUl_dPp^Ju zKC*hi*z$SL6T<^?SRnsACoPieBg~M&qR+5$!}nqbqZ$w0vU#oDgXcg literal 0 HcmV?d00001 diff --git a/tools/bin/org/etsi/common/Tuple.class b/tools/bin/org/etsi/common/Tuple.class new file mode 100644 index 0000000000000000000000000000000000000000..9a69048106381cab04fa969e3451b7c2dc6df91e GIT binary patch literal 948 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 Jj1fG6^&4UaJhlJ; literal 0 HcmV?d00001 diff --git a/tools/bin/org/etsi/its/pcapdump/CmdLineParser$Option$StringOption.class b/tools/bin/org/etsi/its/pcapdump/CmdLineParser$Option$StringOption.class new file mode 100644 index 0000000000000000000000000000000000000000..6c91be837cf951d7773b038207c4c237de380dd9 GIT binary patch literal 920 zcma)4O>fgc5PjpAI5B}jpeay3TG~UC7JNYh6a+|?DuE)3RFng^O|o*ga%^k8=6Asf zi32}?ABC7*M^#FC$YnNf^yc}!$^7~I>o#vp7Stakfjn`+ah>e>9O3>PXa?7GJytvJuCD_HehWmFou zv~t*Ak~*23%c)_@4WSd>cWM{nHsiLvJVppl^GZ+Uv2u({fA@1sCv-k!nbdJA%2JjA zb_jcGY>~fP9|#L9-wSrZ#`y5Sm3R?Nt^uQu@Lj((*go=qqV7E5hQQ&4IOwLmoZX$d>&)@3)d*;xH4 z{sR3_M_NlWic@FQv7=v|QGbnk-`h0M<=q>qMf zWXcS3(b+PhU>H^r#R-OV56}OIJ;6yVH@7zpcTL~42s2i4s=8IyU6b#FkFs~qY%t_X z#}|WWji-w}VHG3}=;Z4VMI0}31``Ye>5qz>8Y@N-!YTfBiXoKFlq1CRWfcP$ZmYbH9Y)hZC9WSX{mh-^a zied&C4yrN4dx*(P8(Q`B>c_YBdLYqQI&+k)sF^M?Tr<4jPG@`M^8=fnY2}6b#$0zU zzl})GXs7;$g4Y?Y9p^Rz3H%NfHFUCsae;wY7Vst~dx>E_-Omjl<(nz>_%6elV@Sv_`9C63RqfYbVwgQfzF=C+ z1nm51YN!Ky1uG1f`p9hJz68M6mzr+ZwlD;2e7^NN0!}HR+p%u?8iM(S$UY$;5I*V(2h*#wA2P&b- z^%ll+Q$0W)Vhmpi5X}$jfW(Q!O9CV=;CM-K0mli_kPqOVQgIxvptUfmv0a?ze@QL0 zi|O2R4DDg25rmpBTnp#B>Mac!U%l<1D^G z7Ef>o^g8f5@WCct?oPOMuCOmQhhdf#SZ9sd1(>t_~ zL|wkdErF@}4gn@3oL<4n!@=M73=ZS99>~)V4@9j*0AZ4DX>((PD43aFLYHJ;m(KW6bgTe9;rcANY}o{6sDJGZOd(Q}|Ut`VE)r z2%N%v&~Pc-K#}0NtTLp;ApO&zJyOthDvcK;vBQe|-i07_5Tp)*6d*{r$>XtrMY5Nv n&H~=S5;X`TdrOYsJzCwS{W94*WZx&dN_LHGnd}E-D~S9H)wm2J literal 0 HcmV?d00001 diff --git a/tools/bin/org/etsi/its/pcapdump/CmdLineParser$OptionException.class b/tools/bin/org/etsi/its/pcapdump/CmdLineParser$OptionException.class new file mode 100644 index 0000000000000000000000000000000000000000..b54e43a72f08753b8f1f60b1c29e7220dab80d9b GIT binary patch literal 489 zcmbVJO-sW-5Ph4*#Kvf~+8zbbgCEcw)Qc4_ML`HERC?bgOI%4dVK){3mM6i3KfoU) z&PGwxi^v}4y_v_%o7tDwr)K~M==*RO_Dh{bqBb&;wTY^PSLv*%qEV5?Qi&_BjnG?{ zRV_<(dY^~}_;49kZ}}aMa;~!Iv%ugTOC{?QhTeAkB^cLQs%*G3VQ@!fDgw074lxIh zp=0M<%!;Yd*L<1_hHhLYJfCnaE&oWm^^G(Phw(rB4jEd7$!zCeo*060In#+alg;dJ ziw~@vAv{+~=uys%5yrBl+!JNeVcWbn@N8Cso1rZ|5KNMHhmB~n>ck;4^+#K<4gEQcb9=N?Zj z*LB8TU%ap)G5_sXBOC~WdLX6n+BWxn;b&knY%U;+dYxIX;(V#tAe9MPeg$htAx&N; z^0M?o(#Z~^G-`@mC96wW3f=2Q{Ri@I^lKAbub*Q@ze&eA)+e}gMqvea>C8o`y9B+5 zP4bIzDYkHrJOYU*7+EySDZyLH2`M#WdxHB0`-X~9r{f>0jwHpKB&1FCEn2}R5qdeU zyFk}2&^6Sk6@?fKl%_l;-63fSpc*Gk0TtAvtZnSjtw%B&c#sU| J+`vOD{RI+){@?%r literal 0 HcmV?d00001 diff --git a/tools/bin/org/etsi/its/pcapdump/CmdLineParser$UnknownSuboptionException.class b/tools/bin/org/etsi/its/pcapdump/CmdLineParser$UnknownSuboptionException.class new file mode 100644 index 0000000000000000000000000000000000000000..e87f730097a852b8baa15e0456ee321ca59e11bd GIT binary patch literal 1127 zcmb7EX>Zd&5Ph4YIdG4J9<&5VX(4t(Yp!xMKqU-Ffe4U7BOw9OCRqi8vyNcaDh zc(-zgf!$}Awp{54Tn2US^hA6w^I=f?@!&l}%Ku#i0WF598@9BATMUbO^%Z}^O^3_2 zSqnT{w#$}LXNXyDOC&JIuyhb`yJtHs;U$q}$W$Chw7HWXwz!=yq%n(m4H_007ACM8 zb%j{ca16^-2=8`z)+ZwY%EvVsHebSXh`D-!>p3S!(OK$yeGWj2!?FcZPMU4 zjgS1%W-NGV`wTnPLug`LR%N=Q;TTk!gHxkZtu2B-VGL2-AStA4ZqI9qdv;jeJ_TCQYlNNkC1&H7e>j|i8_lHKSTdWMg)pjRSh&kLTv~b5k_z^ WL|vjE36Ldx6kE6oC7CT;L+Tf%$sO|m literal 0 HcmV?d00001 diff --git a/tools/bin/org/etsi/its/pcapdump/CmdLineParser.class b/tools/bin/org/etsi/its/pcapdump/CmdLineParser.class new file mode 100644 index 0000000000000000000000000000000000000000..f35caca8f7230bb8d6a5df9d9363cb9bd59151a7 GIT binary patch literal 6525 zcmbVQ33yyp89n!9CU0i?vNUPZPSXwA#$=KqP#`Ty3#4faDd|E3X;UaNNnVqolbK*jmrM?CYXrVL^}e}&SX!trm?59IT$wA24ZnDro$mn zcut@#ecr_5_0AV7RLx))f~hKBIXAv?USaM7@9>i6#ig`4Ve7nFxkzP7cJo6M^=S z$rZW15||5e7ZWXUyg*JxWvhUrG16&zkb`0a1t@fb5C%M$q+=?jDOs6d9+bi>7f5P>;oQk!X@GyC@yh^5gn6O#4f^qV^{j=w_Oq%9P_o z0}V<}C=%|n4kw3BD^NWVyD%PF5`m5_s{&Eme+uXj7V#msXsBpRV`qoRgsiXQWPyd_ zH~hSG0v?=%mC|yj2$W`}LemMXGB6kOXzE587^9tmo_=EbssBG(NFqlv;qZW(!U?m> zj9Dk7<22fI0@`Kl_MinTn2QO+yE%j&p}fo2m@0ENqdO2T{Zg zB#>k|3dWcBL=)$!BC}D>Y&EbAe0Q56v&Rf48Yr%W#bYd6x%zwqpONLIfWzjstR>zVm3@WGDOsjvCHE}f)?r$0fQ~N2EnnEG7 zD-cR^-eD9SUlFJq56J1^E#b&kJF15FdvGnT)A6+oUr{Z9Y2fR)o{XveGIMi48E3du zs^hiRu|f%a!@w7DgFr<##V!9y-=dnDK&-3RgI(CIex%RsTzK1=sZAiAqRX-t%I>XEHUSUGK4LGsxQfQ~h_vJmbqhKk7FaR?e`razTYjGA68rFo ztc^dG8l=U(tzn~VYs&GcfyZPT@oZ&799Jn-$4>>08ISPQk;IBnpes%0ARdvZPZ;<) ze!)(MUT3H2jLyd9kj10Yh^D3ICk^}xza}0d-o|T~P&ye4E7iXSN6LKil!2$E6&>;5 zcJ}8{JY(SZ_yfgtM55=hBr|Jgrh@eR5|W*^YPm-mcsr!%X^}*?8MCevu4p74lvfA3 zZj*G4q@19XUU^+mk8aED*GB01A}HWgQ*7))^lMK`BpK^4R|J)`j2qAqQnY~46b_rQ z#!w(0m)DQ7|B-PRsiUn&N>*-Sw~hxbVbro)L`zUh3^;NpMYywo#qQ)=X0ieoX?@OH+( zllgWQcM6X4eElf$iTg3dH-OT%LQg-Y-H)>Lmznn{l-c}SN?8)gp&bjiR*O;J z=1xePtJ*`597rNXgoIcGT^xtGq7EmBdPSnt5@eI0NGwGoX)IGa#a!}QjukeqW@;nP zFrV6<)K*sAkERrwr4UUCk*CV$S^>|oRt^K_^P;v|&hw_)fHmA9k=NSD4YtO43c0Eu zr)B{@C5>_3FmRrNlSW#Xm1v71dU_VTmT?nZmz8Ks8;Q1N0Y2jpMAv5}xd>lq+2$aP&GRltb?$5SCjaqeFxv-0xN?}XVQka7cS=B0?|*d z50L8suPpZ|em)CqnBPoXu8zuu5^}jf@tZ`>JBYW8sQHqWi>&s;(D`jLuE3QxwHl6s zYn(jNDWfg(s1j#oZ>KG8GTY^=DB?@pl*{pIwiL2zG!R%C+3l-(0AEdE=SXSr$O-Wj z^?6zWTAA2A%-@Y~vMkBG#!h@Jbk0KB!%c+C?c-aWQ|rj6LVcp4s>HFN&gpd)@i1@P zDJuB1B!ydd!hMND^od$gmur2xaVLCy>Pz8UwR(xJ-Gm#w&Jx|hSiD=V$tlrOxTnt9 zhl{<=6z+50hV718y$_wk^+(nwxhI7OQuraulXAoII+xcqh$#cu*XAV?HQ$dP?en@) z_{mN=F_=E_vwc1{y0`et*V{N%yo2@PU9^k$5EAcWoA>}b#D};@{FB$V53yT( zgxkfxa4*M{_?S0`f8z;`Pm29`j%!~P2k{0y>TN9t2Q-J!G^a2$T@+|8F;#Pm8Jb7T z)+UK^%@EaEfvD9A#c^7ZSgMtXmD*IXN}DFuYSTrlRwmlSOX6&8mgvxCi!B_J+Tr2? zZLYXXo2OiLJ9`&8-jJ*E$#PZs?OFVh&gv2u;yINHCW#&R6aLKLJdEwfUs(B_)VTnE z!GVFMTumk;WT1@871u}20rXgq2t}=Vp zIlPWROtoXH&Y`Bf4%u;e9rU0}N31e$3I1K$UhBj?xyW6SI=% zf}s<`0=vzkWTltP;C{ToGs$7AHbn96%M-qq?O2BFSoa2`_Wp$oz0M6?uhu zV36ah9LqVr=5X^TvU0r6_e~t%;Ml_PO^zElzQyq*j&E~(hwI3lQxW_hxl>P~6D)?#+K7bD;COEi$+}(HY z&+`RfkCY)IYzM2jbff0ljoehi)Kh2psSpoo8Rmp_BkqE?qF4NKYh>jJtk$C$MoE}u z`IV3=>5jUUXVH1K$@1dgDV^25IuMd_m~16O&NqI7UC6}*Kjc3Fk@qbSBX}8>o)A`n GBl!a1tt-X= literal 0 HcmV?d00001 diff --git a/tools/bin/org/etsi/its/pcapdump/PcapMultiplexer$1.class b/tools/bin/org/etsi/its/pcapdump/PcapMultiplexer$1.class new file mode 100644 index 0000000000000000000000000000000000000000..88f40a53fe1642745fb7c8fce1acb82f9ed98d5e GIT binary patch literal 1563 zcmb7ETT|0O6#lj?gw_BBR1_5}qR>wd}`S zs00gYdCT(3E)N(q+mAdUS8Rr%Q7k)Q?;s(V+Y^K$g^W6$BgPnv{yoOz7a3BMewnAi z(5fSiOa@7`>DY&MhGc(!QSR*5p`nR9<{XdTiB^|*aL-zDIYaxLZ(Hu76*%%eHl`$W zhWy?@^bQg9jK|kRjSq$kHTeIgtT?wtbV&q`S1INfGdPNF4aZ`_cRe#5$B|=bvTU1& zis^|x)22H6jZcbUid4aaVg^0v)o_xbv+mTlTy&hmX<}W384O}r z!w^G&Ae>{NC2rQ zl*(`ay8=UVNzkOsTh&-!|D})GAQF=ruGf>Ogp(n8Pv|&|E)rqMj{=)d6EmdwKSq2& zGQ^NBITgfkEnAR;bh#|h+E4AO`}W{kp_Z@9LJ@vU|nRX9`W6BL}nB;6C3!VUGD T#!Y2Cid&eal@y31gMPmN|IBnE+cOm=6Jf!&#Pb`}!v zs;xcj-P&rkXtl*2wt{AZrXD>#T3dV9-iK9Nk6!k!()XL$-E2r=3D2`L^B>>${qOgF z@BjZi{_6b?0$8D_Dk>B-*v>$U;bzSi)6KSI;(8{LOJ`cP@MU8z<(iq4F=RL@f(mMO z>3j5+lx_{QZ0_G>#9b9t3L@jJTXUAB_ooa6$8-&4IKW86l6suqk?!$PJ+5O~1MLbz zrj>PdOZpddA5|EfRAo3$e=ez@Zj#B4oS8}(4hN|h##5$Yxe895#&E1#ANGb;$#M-x z>`4f_EW;HLJOI{tU9=aJCI!b&9>UIJ*yrXPqj%6T^u)xq`fU<+!q{WVN^2+Eh$Uq} z(oDG$M`#sew@i19fTu=4sjw#=T#;R4Gi!cIc&~Q5HR4h<%;*m)zAR5MeG>DgG z4KtvHut)*jDOjT6M1)iAonX*1mvn}L;RSJ9?m=6C=yNy93vCKJqTS32VkdtmOU z#_O?G#TzDYxo0@*8fgt3=;SEUOOoUnGwqfwYH+liXlXhT*oJ4eHM#F$do_DQecgvO>xt7#A8jo7H7yNKdMzZy1SGYOKB zP)Ph$1$?|hEELnuGNXQNwio9bj$ z^DuTHE5++2v5Wu(u$ua$ME7W@#VjHIkcMH8;&#pr;Zl~J)QMqHjN76@S8}!&S7^9W zIIA+ZoAk6H9dFTaHLhXMdM0C7l(@xH1U)%jMLiaJzg5HABv933amrHh_A<7|HkSZq zHrzpzJW}-()m#Lj#$VgG9w<;)qza=9n}Tx8N*F^FVq@Z_Gi##q4QGn#x8MkatESZC zHKOf3t{&gLQO^`~a|Tg~m3FQ6DPbrP{l&le4Nv5X0qGdL)v#vv5HtMHi=Nhbowz)*eKhDX}4-P4v`Q( zp`fwL6T-cNX3B_)CvvQyk}L%$TG%n$qAKo~P|N;)8OH7SlrVcg_oVXZiU*8#pWC0- za6C?s(Vx}uIn*hr3negvOo;gqA_v0P@^~HyL}Q{$?%lA5w72B$@2UB)2&BfTO3w81=Wn zF%4hD19U+d%n%j@EBv%g0CIfdpTJ|nYx|V_^ie#n;xPrYr)HwhDGlEcZ&D64ZTLd598YNY7QRh( z$)Rd9^FEzaOhT-1)Dj+jN5iqGk+<(@I0iGhsN!j^I!Q>4URE;8pF5bEwR9d(>83K7 z(g#E}M6D@sTy}pZSzLDgJ!L+t>HI9 z!|HyX4|b<)I}^s!ct*wVNaShOtl?RYx$%^prP|((-)s1Tv;=qArWM8ucuB>JJnM~9 zHYVGPlgsdYUD8brf0Rkbdiv_AR8l&GE|SOhFuR?$;gpxgzV9F_TRJmpNC{3C7! z^OlA2GX5cz`cEDXr-SH-SuEZV{!P&3P%T7}82_u`6}-wt3up>fH^wHWEJGPKT<=uA z#d}?^TZt4;@MViC9(;tDVz)4)c)KVS+O)P5v>%<TRiPHhz#cp2#0{x1D$)@!E)hOZj$)Q&IGrgyn>DhS%c>Eruaw(>+zois3w!TC zg`C~_T_Hu~Jy~Ynld|nSDW-fv4h-Hm&-Q$V`0pgt(dxs2%sIfX z3VIe#75uHE_fv72*D5`{UHEgAI~h?G+aGTp#k}S*%-=qW#t}3%M;4A?@fce8y{vm- z^Sx*~gfmvpz6sjG`|vsiH{z6oSQA+nd;o#%0qM`Pg_*>+YUcfc)JyKW7xGllJd>g1$z#`8in&v z^SGfA|CUIrn?S74}+~9hV%IqrHnNa%Y~>X zYV&y)T8^dIfMq-mor#US`fSBnoV}9s+i77n9DZNPd&oP`iG4U5ci|j7#w&zixq_$? zIrfG5tY_al@h*Cwk2`QZ-c6i0;&Qx)ZvomJ!h4yuAl}EZ8b|r#-_N%XuqBGnVFnXW zp{Q8Ne4h9Us`;w#P;s47Q9Xx@`5->T(US2sw9PT7X=cL5pfE`v-p;(=&9?HqZ>GO3 zUaaDg<8gz>AF=h3f~|R84-h<9KEKLqJ+H)>x%enk?s-?9C1Yg8FGX%z6KoCEgj*|{ z3t6bI4c1orWck<#_VI1sBWNH|ymZ~>r%RaPrz=46c$6XYZr@G{esTnNa?+i7e5N^a zmrsJ(hwufV0r^b^~~xvxHMsocUwE1v%$wJjJ(4`q_z};HT`nffvG`u}!7VbMbS& zh3L7%V`jC-xjCqK6&n;qIn296*kj(K{37c{`Ae5`@eBOYPdaHUG6pmVIC=bvk0 literal 0 HcmV?d00001 diff --git a/tools/bin/org/etsi/its/pcapdump/pcapdump.class b/tools/bin/org/etsi/its/pcapdump/pcapdump.class new file mode 100644 index 0000000000000000000000000000000000000000..ad4271bcbf88ca4416f511a201729e11b8dd4d99 GIT binary patch literal 5223 zcmb7I3t&{m6+M$|_HC9INEU(yQPu#O9|_k+lBm zUu(5$>xWvawQX#*Dxoe>EVZ?@Z7jC6*4CDOq}po#|BprS-1jzQqYF(5o0*-t_s*Sr z&pk7f;kTdM17MyyN<)#tafwu4lWC`|Cd*DYCBsHCl8Ge`bu@Ss$}cpw8ck6n-q+OG zbDz&KzxMtE}+iNQ7d(HY;kbGGeAe$x^c?)2C2X zNYmVEMyXiZmZEG|f0FWQ4b>NfqgLFq7b+Cj)OIU)S`!gEb+keyciAZMX=HpFN8;nh zG)&iUjKa~*-U|4q<5(QWrTR?Uby%UX=Dm@qE##)V!BQv$b?7Mbp;|$oJGZTE{*uK@ zm$bE>EOWDTOoY#e6BH)WImw&jV7yOeYjjM4uM~A?&`_^%Q~^gN96IKpg8S}lYZJ95 z9p$Ky-bp$Fn5;0V-HMy5GO->r)n)WV8L~ioB5Xvvjg%$dbA#RmP6YiZ#(W*~P{}CT zo2@kW&|VlRBf*qRMyzx)kv9Ek!I>HsD9kRbvzh?y$V6=`88x?=DIE*3NMQnl9CF|k zrhBzDwTD^pUD_?O++rO|(5m3i#8YOUm9_YFNp@yf-CM6^W?1f?`oKbzF>XOp%>% zT~e4r06RGtySpxYK*tAh31zve5LkjfbMG5JFAY=NA>@xk2SU3r3~M-IL3>(s8$-+hfIh6D2$vw%p!OIpVjagR^@2sLUEEwDwDL$$g*u=GbxMe_?$R7Damt?F)+egx>81% zW%i)xe?C79orjbrpac);I0Kau)i3IJ1dkGGG@c*U)vie=tUl}@TO8Upx3d$EYxq*0 z{XB6US&4w=I2DZx@`rRhfhV~;Ry1MksR=opXQcWF^2r4#k21aF3!X)X@+|xz0KasxGlfOt*vza@G-~!4 zQP-w(13QE@DWzZN_@$uK?*PK7BR}@b0>4sd9?t@6<6Gj1i*sSgv;7)=qv6-2tpX5-} zd)yp5agqzwUv&J{xic+pZ};Kv3Xs$6pE~{};+mCS7E9Xwe*6dj)$rz+%?em~vDI+^ zZ;?@*+;L3yo#$8XYzoy9?p{ZRg+BW*MKflT1b9iry#P0iM}7o$^hK)Iy+W7vj$V(o zRiRe*j=gwX_Ktuo`nF(PHVT7Bw&q+3#=a zj`MH`)Zs|i5KhDC99MF}^0#<5pORw0H-zT8EY5njjWZa7<~$p| zoQ+Z}#WL51I!K4b77n0i z5Z7dJ!@XGKbZ(jNsq{QVSDZi=vt7hbH9wnk?L};BhH%>e%8D1#y}-w_xN{1&58<8x zOlkI1d9wKQ0Q_!m;Mna4?`wDhUr-pt!-2=L7%U#bt{n_o8hh|n-iD-oj<=d(XUVO6 z4FhK}@U4WzQbJ}0X7hE^fRzNo*;vc>%|`YjSdBQ}EJ>`Pg>GDeb+{Vm($4vKh!T%r z6CNYk4#A}TUOa<7uCf_>Vc`Ypyu_=^K3aGc3A|1#f{k+=FusA^c#7X<Hz-3q~Sp?3xe-I7Ys$^w5d^Rf8Cz#@a)))VP@|;?e&4ZSv=oSA9x{) zAFQemyu_y2Qy=(|v?cX~-j4@R-R!OMX7SS@{Jex=9zcaV@CpaK9H?(#^k2>5jrGmm zXECkH`!rt5;tzMDbP#_YfY+_3`ZD985JvFXQrT_0Vgqj`Qkc#NY-1Gr8T(5}7nic&F5~Fstmi8z zeI@m-V)0$g_scbWzFf=rU5Dkk9__e+8M~1=z8O8Zg%)n*>}~vgJMZszU;uX#i+3@P zpTP6D2QTvi{|fGR5OBUjRr_-Yn1~ngHV!f`mDo#~;QNFgJgbV>E2bZNR55!VdXrTi z_DblF&UvA}h7H05JYuy8W`-h=#0idR#m8iqCHKlC3;!@kuT_Lm*N3=PFg zG}IN%I3Y-M@RH@CgDfV*L<(g&O;$SV>D`1gz&$+d>_#O0^42M+JF$T7qtt!;kgihY z%z;aDjckSHJfxe)*t$&Xb;h1>G+c`G(e~eF~Q7d^2rN~pO|3LqEn-xBeJ8qeSh*op7w~7BFe)17(&<$Sx zZYN?rq|X0TiO4_A%)dveE&s1z_O9TWovzeup55YQJ`!XzH^IDgf@gL)2D2C1IZW#- zheM82`Nw2Foq={Hi*ZtzU&DO0OD)zob^RV@Z>y=<6zgYZ{@u1CR(Hfovgdzcp~yb~ z`Im|O731^`%uyG3ebzk(W-!drcJuNSGM_AVJ3DH%-A9hoD|&5jhPj$)_F4wBB}|%t z;zy3t)g)miz|0oy>}#J--@<&iXmqNQ`lr;*kE?Mmox-bV;ZzrvL|AG19ky}~g6#pCAc?IS) z!_2AtuT{+<&D$OrusOgI~@L> zk}FOBlg2oOR*61Klzk@57EaH9VXi#SGe`KryoPqpgZZ!Orn69(Xs0V#m?MI!)#HG@ zah`23-(l8cas|vwFkiFxZNog#x4CYoTQf(>zBTs5?_d^9;H|ZzPQj$wSY(*mZ;CaU zxj&6LtmprR5lfC!V3wJ`HcrW<)%y&!y&YyRra2C4km$3w?Pk;Yh8b2M#_0)rpY4G8 zT=V*@v&;C^Fn>p%W!lXa6UZEiaSAIF=2)-VKs$HBTtCf^HHRlY1M?4f%z-)f6s2Vf0)b>=(F&2(Pz)t z$7vVLz|%Z)Y7)%fV18gX?{6d8nFdpzs&dmH}ZFIUM`m7RWl^CZf(lpkf zJuvTM*5iwTFwevM*yuB9b}1F@3~)O;W!Gfxh51YfZw|lWqxbDfyV-4r(YKwn+L)SU z)`rneGWSmBU4Oh{w9_;-yAZKfUgFjEYiE%ES@hXzd;Z8j! zFh66Oi;7^LR-3&tg^6*}%^5+aY4q8Cm`{0l?R;w^Oj>KrK9jZ4XQnW7Q5)Jgy)`GmgWgb;C5ZKBia;m~%LDIb!{cSSuV3-%Aun=HGuTPL2c+~mp8MjjZm&E((7?1y%SY3oL&tPO45aC&}(nezwFTz3b|J}}KQrmT%I zC1myuz`3?e^zD1nOh@0w=N5T>g4y#i?LN={_g>Gs88G|7T&UHA@o$Q?wl8n5$oUJg zA`t5pBZ|y_+!o3|x)|32RU-ctvNnv`J`6L1xo&Lqzzl_n>ksWmn&VfI*}Kxb{`kah z9)Y=vX>QsDvm;E!wcVse!ptzQ?LL#^WVG{Vn03D9&Ed@>V77(nb!|$qt}^c_ew(Am znriQ}v?-K-FZ5Z6HcsoZs?8_5wmu5;E@o|ST?Vr`@_*Joho>e9GXQ2YQ5$*H$LaBU zsh(pnA3DjKPupj~ybY##-$mBO3%$tfk%0Ranz_Y3PNgt&%X#Lml)Cw`mto?bmhW%W zztT((Av3bryr;DzsaoGAOpWuD!Q9i@hqVvyz6~Z_50mLJ#?;}USRMU%b9iqYV$m5> zaliS+Mk0TVlYYPXhwAwcI2Pyez-pFk-O}(`8UYyhH>hUE^1?6_1d6% zJPvafvmOt%fLR7}0Pb5XBUhTQog(w0O1HDUHV2Bb%yFXiJ#JQo=LF2mhk5r9N@$#p z!o(Wwf6!>F!$GlrWafX^53znitUieKYxVpW6^i^ZPVKeYKIAn{+bTT2z-+=?_l{P; z{1IkvBX`+nZ{?BsAo{Fbff%O}*=Mxw#X90VCt;pv)`sUNy`2g(Gs|eFZhE&9wec&= zmJj)}=F`axn8(o0M~rrAzbRHb=C$?7E#9$YpS}B%$Uhf-rq%X=QnSvCz2X$ilg#^L zr&rf(W=-@m_j}a_`s{x&FEGdH++vtChtX&L=c?D^ios;k9M;>p$E!AOb9zq09K)=~ z^V9Wq_Atgt_U)=jvz<|*9=+EpwDSzi!smGBrSrdgo0?6rPM_oL6&FV#)^YS%cYFSy ziTf_y!qI2i9NrydtBtcTU-+G8{?$hxr-$t3y86aAwbklzXZ3NSwe~ld?=aV@Yi^jQ z(9Q_EnR8i~#cpSCnHVRFshy>ZJm+8ze5@X84p-qmVC)%~p@ymbrdUgO&&EO>4fR;} z8?j`aZ9Gc(Ka6o|Qy}v9+S94eeuufmhqVuf*7ku(`%^o+x#>Gm+m$f2+Sp#bHU>Vr z*i#O31n=53wC)+*Y-KmUU1ylBwc7A9shxkoe4Te*3awWJ^9b76#BOfQ6lQ|k*-A4N zeS03}_j~JbY9rMDW8G|InA&fO^&oHE3vI9ov1m^WFk;Et*gl)`r#-P{jrmv5IPvCF zXuxuq2VmB>o4dve6MfdAOw^-goQ(N&0p>vFI5mD1=3bcM`kP$Y&b={YcFlzuCCqK5 zwzaAfX6qBIIUIV=S(v+E);8Ly{iayUnfW(K^^PU;FNzTPhr6B4vqk<}lWh54gn5E@ z4srv!kERL%P<|hd*PvN+r#_<=3jR6Xt^*0V4|UTM`cs>+K8=PAO>8o`0o1e@}^#e^9!}KVQ~{F`xc|IgodD2@Sad^K0Z^ZZ}VEA@hL* zx3g)PFgH~1Gg@n}z--JrZ-j;&hgksge|GcqDq*5F?yVALPEfVlAoD8Bsk>R%JfY#` zFt@-I*C>YTa8Rs%%={yE>9I~2apZhDw@Bn)jQo>D{)+n+f5ZIzIP1I=`rta4o00!f zyLo=HFf-iFCfUMVD{I3zzh8rSinWiq2KAid9ZQbWU%e^+u4!&(V42AOQ+uD?fVuW8ug{`WVB)-#_q~z7 zG_Qq_N!Rm%&4l@pG>ti21+#=XPW|Fw;#`~eo!xXaBC{Ln@oud)vZN`lhieyk9MOLc znaAAwW4gjT2XmXK=I$9c${^FRaExpr7I%rW+`(HkKPLNcD31fKAAmG z+q(I0du{l_yusX4o>~nP@8+r6*<>P_JuyzY`AVs+9_zyVB9C_NoMZ=v$p3X+4{^6 z<{z27Ih;Bg=Ka<_lk=%h>)Z1y!0j-BARt|GdoZQzt zmdyXY`bMAWbvDyp+x1}n%^aucp)m2xC~vL3HbO3m+NeaIY3rWioq*e6u3)b3vjSmO zt8LlNuu?L67MtUwc=y2{=5S`;&aDO0sjiKP9l{JZP0Kqf#@)BZ7>jU*Y(Q6J)0@ln{LNT$oTA5? z`D=UP+C5tdlb<};I`rXBUNe7tEdCv7T>-zE>9}oj1JZ6U7SWJ#z_tKM}F~tg+-c#RrM}!*AAS z4Ph>0*7k=zYBmS^{z~VAfC@iGO(2hN2!D!~BAIPwP{9N2P|fc4P^e zJ*jWCIbeBL)YymbhI#G%+N^W!>LoDm!g!kVPOD3bbsO_szUGp5ELj_)H;eo;%=|6y z*Ba|yAj~J3wXyy<%o_H@r&bBG*fhu6*NuB%KET}jb9cd{bD`O1vYjc5$fR?jK29n2 zb)yN)4`$rX8mIhtm~E`4Hck}F!R)jAFT7*P{3nR}F1>Qi{1xwB-wQLA*=OG@gNb)k zRDG73B>F7iW@b~E11ouRxL|J0=H%#qHiKY>FzNWlN$*VQ z*QQ?Y<;S*ndz!&~?>E-FqM_em?-%EHx=!)c>Vp1Fu}(7Q@Xi>-a_jl~P!yT}tcH|- zbhw%Sm@Kb-IL^}?W(9Lk`JpS!8m_bETo>b%W|~jh=Ti%q!Ax^s3z&3%|B~8BKeC-K zof0OEQ?l5H6=qAA2dD6!xf~b=ljgt%O*H;Zv3_RmPsM)Tv1I-W3Pt__$Uj@;?^S1X z51|#zK<2tpQUR0hAt>(kEX*U5?jbZP5azffui7Z`w1zo@c`iJ1SU(pk%r~>hq;suq zdaYHl4dXm*U~XiZrCVX*-GRJ(RE2mxCi`~D%Vg5K1C6RgJH7XmD~mnBFxURUyO&=^ z@8aOS7&3h?8DB$@P_r*XD0C&;ym z&Kt4$PEUK7{d)1{@b4R7(z7v`)*p&>f|-B$XvA7?jV1H{IGFP9TxsTSIq%Us$^A1H zdpf{O;(d-W^g>^l^gK~9PM_8%GlFVE8z+ltoYC%sxr}LE#yz>%Pu1p{%c7k(H9Nxe zWv-7`17YGhz8EKQ-6Q*UeJPm_%G!7~$Xu)5K;OnZ=JebTvr~QE_3+hvnDm^4Y9mTk z2gS-`?oT&-5R0CFAeO&a4`lwiJ1Bp8{-M`)s@Gb3A;%K}GwLX74!eAQg^Bl5sW$x2 zQ2x@)|D4Q7IZhT+%%?i3o=})~^2W(k2lqUa{%px|AJ8zvVYcAS z0aruZD-nB2f!4Fudi)_mn8h%w#QJVAjlS&!bLj%sKJ02V3FdyZ6Q;lAIS<9^!puJ~ zQSUQF{`-Q=KGX8Id_GRp_MMA8ongMfd!NqLv^&i2kiYpnQPxJWFPU91pYDzledcA- zxiA9e1>X0NxLO3m+^U)WN2|}_lHY|HZkm?+(qf!W7I_|kdFKY!KJ02e7bd-nV?L|Z zYJ_5SVa}&EcOuqCYb@DkM@lIFh+Olzui{>Q7nq%RpG9`Hy8?3!OvUr<(k*0mPJ@{( z#>w)`!l>=8FyCRC9go9Y1#<^#`)c)ZI%N7{6$f*< zwVm2HQLIAd8syrASRYzr$#FWhNaP=2_Svjbb5A$cpod`gWUlX>a$qiixl7C2x(1z{ zLZ%yLpf;c8X4%YcFgr2Z*<~5b>1wk)iOkS&)0}5-=ff}`VDA0hX2W~}=3aX{FNpU_ zIwrs@5Vi4glC7PQF#C07Jp*(_x?v82S!kHrZ;ExDS=-%H5Gw|;_8YNeZCnnaK5Jj> zcHYxWfy736ie>2U53YadKKid1u zFHiJY0L&`yJ~PZ-Ft_lYAGn4b*8A*;-Sq!Jm}z*QE?Jmf^+L9V zqcBe}&xK>&f*B1{oRz4*WIF?g2(#FH?@_VV_Mvgw#M_6*;eCtP9x#s?wW0l{SU>PS z`{^1t-8+`dziFh%KOFgM^GT6^Uzi^;YkT}?nBA=TOS46=sEv%9nf+is#GJ#E`og4o zH2X}NZR!h?YNN(>J_fS|b015iJ+X$`Xm|OaYokBRKCknxhbMmxllC#Q9<|z_SfiNN zA5-r}te)0bvd=n}iu@DI+E&b`$0>j2x-sKAOsegljM|o_OMITE9o1tqvF<6%7?@8o z_x{;uVA8s$Sl>IXqjritu}YYVwQ2xNPZ8^TeO&Wyg&79Z+{d)`QmiQ6a~{{c{fI^T zlNn3)S(mp({sA}J6Juf4W3GGiH^HQR_<((!y3Hn2?8C`5?TK+PdobtlYs+EMvn9p3 zu=`jtTc@F&T5VYNe&g&C5A*S#czepC`7i@vn&(>Cx4rt4*$VZjzoV^q*D?X-hnHFR z9$jyYf!P?Qd4AXWm}0GA*7jS^A=Vv;^@Dw!`b1FvEm0eR>0+D|`45Dd$NMaRD|0AJ zdM`#{_75VnMZ(R@K`;j~YvbJ>F#TaFuI*xdg_#R8s-|`hhPf}5w-0}?8z#MvX0}u7 zV~Ul>dpFOO)!sXnth0o2k$7Om6J`yyF{H$+HWcPim;;%6|H>;c zskY5NlkFV7MVPXkiua`xVZPzd`pkxFHJuBCthJ$y6UExjdp71;UFsc6=AXQh@^4ja z*4Z2K`pLK!7zXnl<{546E|{&Y`Ac)mA~IWNnC6@IbM0`LqnNdklLM3XC&lMP#!VqJ zI02@%)-JZ!;|Q1|nCGR9%V0hX6Zf>VAKA|FNo2OoHScLHk$r2d?_?fyvffX1ZCvSX zYVt_LYQkKDHqAvWy8ck~*`#R7pRPajKJ)tgL~NZLPZG?#nEUXzDKH1C`z$Sl%nrq7 zpIN?t$*9L50~MYU4z)HZf~^ zdsoDwdvc08n{k8kr+aexy;DX0qhTJc&3Zr8wW}%2SJZtr`y`nzSsM!T37CzT`|w^r zn3-yGULl!bs11Fb6rX__19LOe++P8c?n^7y_xX8b(tTpB-id93l?9)(SA6f>Gcc=|XS9ofFzH=O zkKJ5dN+!K)d2cgeuC>?31enh<&l`XFz>J4UpBW!YuB?rRY~Vf@0NS?iGKZL9A!BSX!^i{Bzb({xJdgY=4x< z-|KVsv0YO=lVHwenpH(GXTlWUy;Qx=HfEAJAOmK$FmtnP>&CM%r|f5~8}3^+!kiDY zTx+FuoHorQGq%|L4g;_6^rLkn73L0JJKc4c!_0tLVK=`WOJ;nU+Zm+wZN9x8$qWi+ zJ?C-Py{Mb!_d{s*bBJ|?wnp@ke2>arU&?<-0P@$y$?JPmsJ5rT?894Y-A&rV zr0>e8viI5ka$y$3tP*{uFsH)Y@iT7@H@gGo_xO&TT6Xhb37Ls#XY=Hm%xN&Y1hPI0 z;BFoPbGOyhY>IWRh?jrMONdou{f;2H*8U_u&oeCC{9d0erMB9h4s!!@oPv+TJPfn0 zz0Z!WqCOi=rZ!IhvCpR&FmEu;4!dA_VEWlj&muBMV4U>tUs9Maz+Bjvb*^=Hq;=z0 zn70|G_M2j5^6urkLvr+3w;QqKIGvm#^3O&7*`m%A`Ok#eg4t(b%V7S7{OjAz(@A8G zOf$bH%krI1#`VW6nA4c+M#Nm07u4ptXfl%$RHkv?Vm8bsCt1(N++AD3yks@C_EM~E zyfd=T)ApUKW4e3e*_bfRIiQUb#bQ2-a7VYm-$(L6{$?yWPJf@G z{6~c&e{DV~@}CFOk9l_K=ZE~Ssr#&|Q1n@b*=LIHfO`?9eSZCJin)L3g5z>HkLTWd!((d)5+v8QOiDOMD7oJLRA=aU&r)<)wRsFt4D`oJRiAY!WQYaC~27R88h|@e^{o-Km2C- zzX@{{bKRJO{Yi|IqP8Pu36sW2o5PAeTMTm)bDUmU4)ZkHsaUHX94qP(m!ZoG4C20oi2 z);-hI#))F}WS%3I^r$)ie!l;lead<+x<4EY zlh${y+Mrl@%-ZacXA8u>bziDYW~ zu)=%~W)$;!c+D5OY4(|1H%3n}O>M0$vd`i7VOI8Ly|?LJw+`kWwA0*Ev^h+%t~2{= z{o8sh#h(7u2$6q=xhEbdHP;~e%=iF&F8BkOXPIZr+_^A!TJx8EmJ&_oP>hqlCmyuV z;VhU_ne~{TqK}iJofATganjE&3Nst#P^S4!98CH@q@YdQ> zy%B3TVx2c)$v%7EU*wP42x=y3!z?_3jcn)o zOkq}<&uT4em9Zy&LG5Ik*EhkO4byyvDb3v3WKJr^`kq|V9LRwg)q;25qUtovmtlIH zr72czUTuW=EJv&bh^073f3a|ukv-(>pcaWbFF zF#jf#q8@W${>oc7!u%${{0L@q`&w1dnatnt7Sk9&{8H2c)&dFQ1tXAi`BANhB*=fBgJ@=wD!waKn2 z|2&xAGyAL|?v)7BZ8vw98)k5nw`t7be3)yQW}p*h7TVd>ZWfjZv)JuyYcq{G@D?O}Dqrz;3J+`%b%t?jS7ZL0U@qZ(zAvo# zahRK7Mk8-AkL9{oB0kSEmCQ0RPCr+_{)jo3mBg39?1S%`c%S-9 znnxB=J71_Y|0d~Cue0>E9M3l}Q%YWrK5 z0nGX2np-zNfvyvijoy;&Jk^`bxdAY%L_5953GcRTff>Q9$4c; zXGd)glm^+Z846(fN3*^+I;`_C-5g_>+HZ<=ojHfQ#35E)iR%{udqanjrQTd6rt#@@dJX64hYXX;_G)Ae?mre;&DA-sD%VF{}di{{e^d;WeC z#5m=m&$30I{T^iIZ>+UDVQ%+j-A4->@;b~~Fo)SqfANmWoCKK3!Yog+ncu_g#$0QM zQ=gHk*i)R5)J|bW)nx91*=i$itsPkprUT|6qn+AsiWSCOYm-Oou@a0}vbGxri~Ix3 zzX$(EmaWfr!+hcj@9Z+BpWbIf>?UrV>V4Lss-`~s0p`|&Jae22dq2H{sA%WCm&r^o zR<+ZZPkUhQ=UoqnjmLMN#8+C!N%n2?V`R=wgIQ2hJIQ<;f5U|F{2*+6D{oWlYIiO(OX=5WWi$(#!FK5Y)4FSX5q{V>O+@veEMy#*8B_bAs#ZJa39?aVc3#wNsi z7qPHE-SRNSk#**pP5GxKnETTOxzsapi)KM~^;QYF>{@7n&Q$a4^82Ge{k5hm`}=FhX6 z-Gj)a`?ap*n%1C0Fs}^Z?Zb&~EnfC3AeZ+v(0$nU5A$cuHWl+rs)Dm9WLf zVUC0Oo?&XgDb~PUy!GI%Hr}!1I6Zn!^jW3b8J;fkSDambgc-@4Pnk}bBa#0~BY$Z= zRwDWgRU2DAI;knvuf++dc)LyA3?0U4)JPZ`7XptK>izySaO_( oEE4&rxt$SOpDAkNXP9f41VL1I<+Pi9R3qe}T$VEC2ui literal 0 HcmV?d00001 diff --git a/tools/itsdump.pcapng_1475823029887 b/tools/itsdump.pcapng_1475823029887 new file mode 100644 index 0000000000000000000000000000000000000000..82d353e51e55027d3ff1eff9dc4de369b7396786 GIT binary patch literal 24 Vcmca|c+)~A1{MYcU}RtfasWbj0`mX> literal 0 HcmV?d00001 diff --git a/tools/lib/PcapDump.jar b/tools/lib/PcapDump.jar new file mode 100644 index 0000000000000000000000000000000000000000..f67ac0813a5ea190f94ccfc6e43c9592f4819365 GIT binary patch literal 24430 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 LaBw;5*WdmHYnIq2 literal 0 HcmV?d00001 diff --git a/tools/src/org/etsi/common/ByteHelper.java b/tools/src/org/etsi/common/ByteHelper.java new file mode 100644 index 000000000..b595b4c1c --- /dev/null +++ b/tools/src/org/etsi/common/ByteHelper.java @@ -0,0 +1,284 @@ +package org.etsi.common; + +import java.nio.ByteOrder; + +public class ByteHelper { + + public static byte[] changeEndianness(byte [] in) { + byte[] out = new byte[in.length]; + for(int i=0; i < in.length; i++) { + out[in.length - i -1] = in[i]; + } + return out; + } + + public static byte[] intToByteArray(int value, int length, ByteOrder byteOrder) { + if(byteOrder == ByteOrder.LITTLE_ENDIAN) { + return changeEndianness(intToByteArray(value, length)); + } + return intToByteArray(value, length); + } + + public static byte[] intToByteArray(int value, int length) { + byte[] b = new byte[length]; + for (int i = length - 1; i >= 0; i--) { + int offset = (b.length - 1 - i) * 8; + b[i] = (byte) ((value >>> offset) & 0xFF); + } + return b; + } + + public static byte[] longToByteArray(long value, int length, ByteOrder byteOrder) { + if(byteOrder == ByteOrder.LITTLE_ENDIAN) { + return changeEndianness(longToByteArray(value, length)); + } + return longToByteArray(value, length); + } + + public static byte[] longToByteArray(long value, int length) { + byte[] b = new byte[length]; + for (int i = length - 1; i >= 0; i--) { + int offset = (b.length - 1 - i) * 8; + b[i] = (byte) ((value >>> offset) & 0xFF); + } + return b; + } + + /** Convert a byte array into a boolean + * + * @param b The byte array to convert + * @return The boolean value on success, false otherwise + */ + public static Boolean byteArrayToBoolean(byte[] b) { + // Sanity check + if ((b == null) || (b.length != 1)) { + return null; + } + + return new Boolean(b[0] == 0x01); + } // End of method byteArrayToBoolean + + public static Short byteArrayToShort(final byte[] b, ByteOrder byteOrder) { + if(byteOrder == ByteOrder.LITTLE_ENDIAN) { + return byteArrayToShort(changeEndianness(b)); + } + return byteArrayToShort(b); + } + + /** Convert a byte array into a short value assuming that the first byte is the most significant + * + * @param b The byte array to convert + * @return The short value on success, 'Integer.MAX_VALUE' otherwise + */ + public static Short byteArrayToShort(final byte[] b) { + // Sanity check + if ((b == null) || ((b.length * Byte.SIZE) > Short.SIZE)) { + return Short.MAX_VALUE; + } + + short value = 0; + for (Short i = 0; i < b.length; i++) { + value = (short)((value << 8) + (b[i] & 0xff)); + } + + return new Short(value); + } // End of method byteArrayToInt + + public static Integer byteArrayToInt(final byte[] b, ByteOrder byteOrder) { + if(byteOrder == ByteOrder.LITTLE_ENDIAN) { + return byteArrayToInt(changeEndianness(b)); + } + return byteArrayToInt(b); + } + + /** Convert a byte array into an integer assuming that the first byte is the most significant + * + * @param b The byte array to convert + * @return The integer value on success, 'Integer.MAX_VALUE' otherwise + */ + public static Integer byteArrayToInt(final byte[] b) { + // Sanity check + if ((b == null) || ((b.length * Byte.SIZE) > Integer.SIZE)) { + return Integer.MAX_VALUE; + } + + int value = 0; + for (int i = 0; i < b.length; i++) { + value = (value << 8) + (b[i] & 0xff); + } + + return new Integer(value); + } // End of method byteArrayToInt + + public static Long byteArrayToLong(final byte[] b, ByteOrder byteOrder) { + if(byteOrder == ByteOrder.LITTLE_ENDIAN) { + return byteArrayToLong(changeEndianness(b)); + } + return byteArrayToLong(b); + } + + /** Convert a byte array into a Long assuming that the first byte is the most significant + * + * @param b The byte array to convert + * @return The Long value on success, 'Long.MAX_VALUE' otherwise + */ + public static Long byteArrayToLong(final byte[] b) { + // Sanity check + if ((b == null) || ((b.length * Byte.SIZE) > Long.SIZE)) { + return Long.MAX_VALUE; + } + + long value = 0; + for (int i = 0; i < b.length; i++) { + value = (value << 8) + (b[i] & 0xff); + } + + return new Long(value); + } // End of method byteArrayToLong + + public static byte[] hexStringToByteArray(final String s) { + String str = ""; + for(String ss : s.split("[^0-9A-Fa-f]")) { + str = str + ss; + } + int len = str.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(str.charAt(i), 16) << 4) + + Character.digit(str.charAt(i+1), 16)); + } + return data; + } + + public static byte[] concat(byte[]... arrays) { + int length = 0; + for (byte[] array : arrays) { + if(array != null) { + length += array.length; + } + } + byte[] result = new byte[length]; + int position = 0; + for (byte[] array : arrays) { + if(array != null) { + System.arraycopy(array, 0, result, position, array.length); + position += array.length; + } + } + return result; + } + + + /** Extract a sub part of a byte array + * @param array The original array + * @param offset The offset to start the extract operation + * @param length The number of bytes to extract + * @return The sub part of a provided byte array + */ + public static byte[] extract(final byte[] array, final int offset, final int length) { + // Sanity check + if ((array == null) || (array.length == 0) || (offset > array.length)) { + return null; + } + + byte[] result = new byte[length]; + System.arraycopy(array, offset, result, 0, length); + return result; + } + + /** + * This method convert a byte array containing the couple (length + string) into a string + * @param b The byte array to convert + * @return A string value + */ + public static String byteArrayWithLengthToString(final byte[] b) { + // Sanity check + if (b == null) { + return null; + } else if (b.length == 0) { + return ""; + } + + // Extract the length of the string + int length = byteArrayToInt(extract(b, 0, 4)); + // Extract the the string + String result = ""; + for (int i = 0; i < length; i++) { + result += (char)(b[4 + i]); + } // End of 'for' statement + + return result; + } + + public static String byteArrayToString(final byte[] buffer) { + + String result = ""; + if (buffer != null) { + for(int i=0; i < buffer.length; ++i) { + result += String.format("%02X", (byte)buffer[i]); + } + } + return result; + } + + /** + * Dump a byte array in hex/ascii mode. + * @param label The dump label + * @param buffer The byte array to dump + */ + public synchronized static void dump(final String label, final byte[] buffer) + { + if ((buffer != null) && (buffer.length != 0)) + { + System.out.println(label); + StringBuilder finalHexLine = new StringBuilder(); + StringBuilder finalCharLine = new StringBuilder(); + int nCounter = 0; + int nOffset = 0; + // Flush header. + System.out.println(" HEX | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F : 0 1 2 3 4 5 6 7 8 9 A B C D E F "); + System.out.println("-----|+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-:--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"); + for (int i = 0; i < buffer.length; ++i) + { + byte c = (byte)buffer[i]; + + String fmtHex = String.format("%02x ", c); + String fmtChar = String.format("%c ", Character.isISOControl((char)c) || c < 0 ? '.' : (char)c); + + if (nOffset % 16 == 0) + { + finalHexLine.append(String.format("%05x| ", nOffset)); + } + + finalHexLine.append(fmtHex); + finalCharLine.append(fmtChar); + if (nCounter == 15) + { + // Flush line. + System.out.println(String.format("%s : %s", finalHexLine.toString(), finalCharLine.toString())); + // Reset buffer. + finalHexLine.delete(0, finalHexLine.length()); + finalCharLine.delete(0, finalCharLine.length()); + + nCounter = 0; + } + else + { + nCounter++; + } + nOffset++; + } + if (nCounter < 16) + { + // Pad till 15. + for (int i = nCounter; i < 16; i++) + { + finalHexLine.append(" "); + finalCharLine.append(" "); + } + // Flush line. + System.out.println(String.format("%s : %s", finalHexLine.toString(), finalCharLine.toString())); + } + } + } +} diff --git a/tools/src/org/etsi/common/ITuple.java b/tools/src/org/etsi/common/ITuple.java new file mode 100644 index 000000000..cb4490051 --- /dev/null +++ b/tools/src/org/etsi/common/ITuple.java @@ -0,0 +1,25 @@ +/** + * @author STF 424_ITS_Test_Platform + * @version $URL$ + * $Id$ + */ +package org.etsi.common; + +/** + * This interface provides mandatory method to be implemented by a Tuple {A, B} + * @param Type of the first member of the Tuple + * @param Type of the second member of the Tuple + */ +public interface ITuple { + + /** Retrieve the A element of the tuple + * @return the _a + */ + public abstract A getA(); + + /** Retrieve the B element of the tuple + * @return the _b + */ + public abstract B getB(); + +} \ No newline at end of file diff --git a/tools/src/org/etsi/common/KPM.java b/tools/src/org/etsi/common/KPM.java new file mode 100644 index 000000000..abf88b67a --- /dev/null +++ b/tools/src/org/etsi/common/KPM.java @@ -0,0 +1,61 @@ +/** + * Knuth-Morris-Pratt Algorithm implementation + * @author ETSI / STF481 + * @version $URL$ + * $Id$ + * Credit http://www.fmi.uni-sofia.bg/ + */ +package org.etsi.common; + +public class KPM { + + /** + * Search the data byte array for the first occurrence of the byte array pattern within given boundaries. + * @param data + * @param start First index in data + * @param stop Last index in data so that stop-start = length + * @param pattern What is being searched. '*' can be used as wildcard for "ANY character" + * @return + */ + public static int indexOf( byte[] data, int start, int stop, byte[] pattern) { + if( data == null || pattern == null) return -1; + + int[] failure = computeFailure(pattern); + + int j = 0; + + for( int i = start; i < stop; i++) { + while (j > 0 && ( pattern[j] != '*' && pattern[j] != data[i])) { + j = failure[j - 1]; + } + if (pattern[j] == '*' || pattern[j] == data[i]) { + j++; + } + if (j == pattern.length) { + return i - pattern.length + 1; + } + } + return -1; + } + + /** + * Computes the failure function using a boot-strapping process, + * where the pattern is matched against itself. + */ + private static int[] computeFailure(byte[] pattern) { + int[] failure = new int[pattern.length]; + + int j = 0; + for (int i = 1; i < pattern.length; i++) { + while (j>0 && pattern[j] != pattern[i]) { + j = failure[j - 1]; + } + if (pattern[j] == pattern[i]) { + j++; + } + failure[i] = j; + } + + return failure; + } +} // End of class KPM \ No newline at end of file diff --git a/tools/src/org/etsi/common/Tuple.java b/tools/src/org/etsi/common/Tuple.java new file mode 100644 index 000000000..424a603aa --- /dev/null +++ b/tools/src/org/etsi/common/Tuple.java @@ -0,0 +1,52 @@ +/** + * @author STF 424_ITS_Test_Platform + * @version $URL$ + * $Id$ + */ +package org.etsi.common; + +/** + * This class implements the ITuple interface + * @param Type of the first member of the Tuple + * @param Type of the second member of the Tuple + */ +public class Tuple implements ITuple { + + /** + * A element of the tuple + */ + private A _a; + + /** + * B element of the tuple + */ + private B _b; + + /** + * Constructor + * @param a The A element of the new tuple + * @param b The B element of the new tuple + */ + public Tuple(A a, B b) { + _a = a; + _b = b; + } + + /** + * Retrieve the A element of the tuple + * @return the _a + */ + @Override + public A getA() { + return _a; + } + + /** + * Retrieve the B element of the tuple + * @return the _b + */ + @Override + public B getB() { + return _b; + } +} diff --git a/tools/src/org/etsi/its/pcapdump/CmdLineParser.java b/tools/src/org/etsi/its/pcapdump/CmdLineParser.java new file mode 100644 index 000000000..195d5a59f --- /dev/null +++ b/tools/src/org/etsi/its/pcapdump/CmdLineParser.java @@ -0,0 +1,568 @@ +package org.etsi.its.pcapdump; + +import java.text.NumberFormat; +import java.text.ParseException; +import java.util.Hashtable; +import java.util.Locale; +import java.util.Vector; + + +/** + * Largely GNU-compatible command-line options parser. Has short (-v) and + * long-form (--verbose) option support, and also allows options with + * associated values (-d 2, --debug 2, --debug=2). Option processing + * can be explicitly terminated by the argument '--'. + * + * @author Steve Purcell + * @version $Revision$ + */ +public class CmdLineParser { + + /** + * UID + */ + private static final long serialVersionUID = -5690842973330286842L; + + /** + * Base class for exceptions that may be thrown when options are parsed + */ + public static abstract class OptionException extends Exception { + OptionException(String msg) { super(msg); } + } + + /** + * Thrown when the parsed command-line contains an option that is not + * recognised. getMessage() returns + * an error string suitable for reporting the error to the user (in + * English). + */ + public static class UnknownOptionException extends OptionException { + /** + * UID + */ + private static final long serialVersionUID = -5690842973330286842L; + + /** + * Constructor + * @param optionName Option identifier + */ + UnknownOptionException( String optionName ) { + this(optionName, "Unknown option '" + optionName + "'"); + } + + /** + * Constructor + * @param optionName Option identifier + * @param msg Error message + */ + UnknownOptionException( String optionName, String msg ) { + super(msg); + this.optionName = optionName; + } + + /** + * @return the name of the option that was unknown (e.g. "-u") + */ + public String getOptionName() { return this.optionName; } + private String optionName = null; + } + + /** + * Thrown when the parsed commandline contains multiple concatenated + * short options, such as -abcd, where one is unknown. + * getMessage() returns an english human-readable error + * string. + * @author Vidar Holen + */ + public static class UnknownSuboptionException extends UnknownOptionException { + + /** + * UID + */ + private static final long serialVersionUID = -3886188976129160327L; + + private char suboption; + + /** + * Constructor + * @param option Option value + * @param suboption Sub-option value + */ + UnknownSuboptionException( String option, char suboption ) { + super(option, "Illegal option: '"+suboption+"' in '"+option+"'"); + this.suboption=suboption; + } + /** + * @return The sub-option value + */ + public char getSuboption() { return suboption; } + } + + /** + * Thrown when the parsed commandline contains multiple concatenated + * short options, such as -abcd, where one or more requires a value. + * getMessage() returns an english human-readable error + * string. + * @author Vidar Holen + */ + public static class NotFlagException extends UnknownOptionException { + /** + * UID + */ + private static final long serialVersionUID = -5862485101945261269L; + + private char notflag; + + NotFlagException( String option, char unflaggish ) { + super(option, "Illegal option: '"+option+"', '"+ + unflaggish+"' requires a value"); + notflag=unflaggish; + } + + /** + * @return the first character which wasn't a boolean (e.g 'c') + */ + public char getOptionChar() { return notflag; } + } + + /** + * Thrown when an illegal or missing value is given by the user for + * an option that takes a value. getMessage() returns + * an error string suitable for reporting the error to the user (in + * English). + */ + public static class IllegalOptionValueException extends OptionException { + /** + * UID + */ + private static final long serialVersionUID = -3519380930288555047L; + + public IllegalOptionValueException( Option opt, String value ) { + super("Illegal value '" + value + "' for option " + + (opt.shortForm() != null ? "-" + opt.shortForm() + "/" : "") + + "--" + opt.longForm()); + this.option = opt; + this.value = value; + } + + /** + * @return the name of the option whose value was illegal (e.g. "-u") + */ + public Option getOption() { return this.option; } + + /** + * @return the illegal value + */ + public String getValue() { return this.value; } + private Option option; + private String value; + } + + /** + * Representation of a command-line option + */ + public static abstract class Option { + + protected Option( String longForm, boolean wantsValue ) { + this(null, longForm, wantsValue); + } + + protected Option( char shortForm, String longForm, + boolean wantsValue ) { + this(new String(new char[]{shortForm}), longForm, wantsValue); + } + + private Option( String shortForm, String longForm, boolean wantsValue ) { + if ( longForm == null ) + throw new IllegalArgumentException("Null longForm not allowed"); + this.shortForm = shortForm; + this.longForm = longForm; + this.wantsValue = wantsValue; + } + + public String shortForm() { return this.shortForm; } + + public String longForm() { return this.longForm; } + + /** + * Tells whether or not this option wants a value + */ + public boolean wantsValue() { return this.wantsValue; } + + public final Object getValue( String arg, Locale locale ) + throws IllegalOptionValueException { + if ( this.wantsValue ) { + if ( arg == null ) { + throw new IllegalOptionValueException(this, ""); + } + return this.parseValue(arg, locale); + } + else { + return Boolean.TRUE; + } + } + + /** + * Override to extract and convert an option value passed on the + * command-line + */ + protected Object parseValue( String arg, Locale locale ) + throws IllegalOptionValueException { + return null; + } + + private String shortForm = null; + private String longForm = null; + private boolean wantsValue = false; + + public static class BooleanOption extends Option { + public BooleanOption( char shortForm, String longForm ) { + super(shortForm, longForm, false); + } + public BooleanOption( String longForm ) { + super(longForm, false); + } + } + + /** + * An option that expects an integer value + */ + public static class IntegerOption extends Option { + public IntegerOption( char shortForm, String longForm ) { + super(shortForm, longForm, true); + } + public IntegerOption( String longForm ) { + super(longForm, true); + } + protected Object parseValue( String arg, Locale locale ) + throws IllegalOptionValueException { + try { + return new Integer(arg); + } + catch (NumberFormatException e) { + throw new IllegalOptionValueException(this, arg); + } + } + } + + /** + * An option that expects a long integer value + */ + public static class LongOption extends Option { + public LongOption( char shortForm, String longForm ) { + super(shortForm, longForm, true); + } + public LongOption( String longForm ) { + super(longForm, true); + } + protected Object parseValue( String arg, Locale locale ) + throws IllegalOptionValueException { + try { + return new Long(arg); + } + catch (NumberFormatException e) { + throw new IllegalOptionValueException(this, arg); + } + } + } + + /** + * An option that expects a floating-point value + */ + public static class DoubleOption extends Option { + public DoubleOption( char shortForm, String longForm ) { + super(shortForm, longForm, true); + } + public DoubleOption( String longForm ) { + super(longForm, true); + } + protected Object parseValue( String arg, Locale locale ) + throws IllegalOptionValueException { + try { + NumberFormat format = NumberFormat.getNumberInstance(locale); + Number num = (Number)format.parse(arg); + return new Double(num.doubleValue()); + } + catch (ParseException e) { + throw new IllegalOptionValueException(this, arg); + } + } + } + + /** + * An option that expects a string value + */ + public static class StringOption extends Option { + public StringOption( char shortForm, String longForm ) { + super(shortForm, longForm, true); + } + public StringOption( String longForm ) { + super(longForm, true); + } + protected Object parseValue( String arg, Locale locale ) { + return arg; + } + } + } + + /** + * Add the specified Option to the list of accepted options + */ + public final Option addOption( Option opt ) { + if ( opt.shortForm() != null ) + this.options.put("-" + opt.shortForm(), opt); + this.options.put("--" + opt.longForm(), opt); + return opt; + } + + /** + * Convenience method for adding a string option. + * @return the new Option + */ + public final Option addStringOption( char shortForm, String longForm ) { + return addOption(new Option.StringOption(shortForm, longForm)); + } + + /** + * Convenience method for adding a string option. + * @return the new Option + */ + public final Option addStringOption( String longForm ) { + return addOption(new Option.StringOption(longForm)); + } + + /** + * Convenience method for adding an integer option. + * @return the new Option + */ + public final Option addIntegerOption( char shortForm, String longForm ) { + return addOption(new Option.IntegerOption(shortForm, longForm)); + } + + /** + * Convenience method for adding an integer option. + * @return the new Option + */ + public final Option addIntegerOption( String longForm ) { + return addOption(new Option.IntegerOption(longForm)); + } + + /** + * Convenience method for adding a long integer option. + * @return the new Option + */ + public final Option addLongOption( char shortForm, String longForm ) { + return addOption(new Option.LongOption(shortForm, longForm)); + } + + /** + * Convenience method for adding a long integer option. + * @return the new Option + */ + public final Option addLongOption( String longForm ) { + return addOption(new Option.LongOption(longForm)); + } + + /** + * Convenience method for adding a double option. + * @return the new Option + */ + public final Option addDoubleOption( char shortForm, String longForm ) { + return addOption(new Option.DoubleOption(shortForm, longForm)); + } + + /** + * Convenience method for adding a double option. + * @return the new Option + */ + public final Option addDoubleOption( String longForm ) { + return addOption(new Option.DoubleOption(longForm)); + } + + /** + * Convenience method for adding a boolean option. + * @return the new Option + */ + public final Option addBooleanOption( char shortForm, String longForm ) { + return addOption(new Option.BooleanOption(shortForm, longForm)); + } + + /** + * Convenience method for adding a boolean option. + * @return the new Option + */ + public final Option addBooleanOption( String longForm ) { + return addOption(new Option.BooleanOption(longForm)); + } + + /** + * Equivalent to {@link #getOptionValue(Option, Object) getOptionValue(o, + * null)}. + */ + + public final Object getOptionValue( Option o ) { + return getOptionValue(o, null); + } + + + /** + * @return the parsed value of the given Option, or the given default 'def' + * if the option was not set + */ + public final Object getOptionValue( Option o, Object def ) { + Vector v = (Vector)values.get(o.longForm()); + + if (v == null) { + return def; + } + else if (v.isEmpty()) { + return null; + } + else { + Object result = v.elementAt(0); + v.removeElementAt(0); + return result; + } + } + + + /** + * @return A Vector giving the parsed values of all the occurrences of the + * given Option, or an empty Vector if the option was not set. + */ + public final Vector getOptionValues( Option option ) { + Vector result = new Vector(); + + while (true) { + Object o = getOptionValue(option, null); + + if (o == null) { + return result; + } + else { + result.addElement(o); + } + } + } + + + /** + * @return the non-option arguments + */ + public final String[] getRemainingArgs() { + return this.remainingArgs; + } + + /** + * Extract the options and non-option arguments from the given + * list of command-line arguments. The default locale is used for + * parsing options whose values might be locale-specific. + */ + public final void parse( String[] argv ) + throws IllegalOptionValueException, UnknownOptionException { + + // It would be best if this method only threw OptionException, but for + // backwards compatibility with old user code we throw the two + // exceptions above instead. + + parse(argv, Locale.getDefault()); + } + + /** + * Extract the options and non-option arguments from the given + * list of command-line arguments. The specified locale is used for + * parsing options whose values might be locale-specific. + */ + public final void parse( String[] argv, Locale locale ) + throws IllegalOptionValueException, UnknownOptionException { + + // It would be best if this method only threw OptionException, but for + // backwards compatibility with old user code we throw the two + // exceptions above instead. + + Vector otherArgs = new Vector(); + int position = 0; + this.values = new Hashtable(10); + while ( position < argv.length ) { + String curArg = argv[position]; + if ( curArg.startsWith("-") ) { + if ( curArg.equals("--") ) { // end of options + position += 1; + break; + } + String valueArg = null; + if ( curArg.startsWith("--") ) { // handle --arg=value + int equalsPos = curArg.indexOf("="); + if ( equalsPos != -1 ) { + valueArg = curArg.substring(equalsPos+1); + curArg = curArg.substring(0,equalsPos); + } + } else if(curArg.length() > 2) { // handle -abcd + for(int i=1; i alldevs = new ArrayList(); // Will be filled with NICs + + + int r = Pcap.findAllDevs(alldevs, errbuf); + if (r != Pcap.OK || alldevs.isEmpty()) { + System.err.printf("Can't read list of devices, error is %s", errbuf.toString()); + return; + } + + // Find the right interface + int ifaceIndex = 0; + String expectedIface = PcapMultiplexer.ExpectedIface; + for( ; ifaceIndex < alldevs.size(); ifaceIndex++) { + try { + if (expectedIface.equalsIgnoreCase(ByteHelper.byteArrayToString(alldevs.get(ifaceIndex).getHardwareAddress()))) { + // Interface found + break; + } + } catch (IOException e) { + // ignore + } + } + // Check result + if (ifaceIndex == alldevs.size()) { + throw new RuntimeException(String.format("EthernetLayer.register: Network interface %s not found", expectedIface)); + } + + device = alldevs.get(ifaceIndex); + System.out.println("Listening: " + device.getName()); + } + + /** + * Gets the unique factory instance + * @return PcapMultiplexer instance + */ + public static PcapMultiplexer getInstance(final String macAddress){ + ExpectedIface = macAddress; + return (instance = new PcapMultiplexer()); + } + + /** + * Gets the unique factory instance + * @return PcapMultiplexer instance + */ + public static PcapMultiplexer getInstance(){ + return instance; + } + + public synchronized void register(ILayer client, short frameType) { + // Open interface + int snaplen = 64 * 1024; // Capture all packets, no truncation + int flags = Pcap.MODE_PROMISCUOUS; // capture all packets + int timeout = 10; // 10 millis + pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf); + + if (pcap == null) { + System.err.printf("Error while opening device for capture: " + errbuf.toString()); + return; + } + captureThread = new Thread(this); + captureThread.start(); + filter = String.format("ether proto 0x%04x", frameType); + System.out.println("New filter: " + filter); + + // Apply filter + PcapBpfProgram bpfFilter = new PcapBpfProgram(); + int optimize = 0; // 1 means true, 0 means false + int netmask = 0; + int r = pcap.compile(bpfFilter, filter, optimize, netmask); + if (r != Pcap.OK) { + System.out.println("Filter error: " + pcap.getErr()); + } + pcap.setFilter(bpfFilter); + + dumper = pcap.dumpOpen(client.getFileName()); + + _client = client; + } + + public synchronized void unregister(ILayer client) { + pcap.breakloop(); + dumper.close(); + try { + captureThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + pcap.close(); + } + + /** + * Thread function for jpcap capture loop + * @see java.lang.Runnable#run() + */ + @Override + public void run() { + + PcapPacketHandler dumpHandler = new PcapPacketHandler() { + + private int counter = 0; + + @Override + public void nextPacket(PcapPacket packet, String user) { + dumper.dump(packet); + counter += 1; + if (counter == 500) { + System.out.println("nextPacket: Flushing file"); + dumper.flush(); + counter = 0; + } + } + }; + + pcap.loop(-1, dumpHandler, "pcapdump"); + } + + /** + * Jpcap capture device + */ + private Pcap pcap; + + /** + * Jpcap capture thread instance. + */ + private Thread captureThread; + + PcapIf device; + private String filter; +} \ No newline at end of file diff --git a/tools/src/org/etsi/its/pcapdump/pcapdump.java b/tools/src/org/etsi/its/pcapdump/pcapdump.java new file mode 100644 index 000000000..d679f2f77 --- /dev/null +++ b/tools/src/org/etsi/its/pcapdump/pcapdump.java @@ -0,0 +1,188 @@ +/** + * + */ +package org.etsi.its.pcapdump; + +import java.io.File; +import java.io.IOException; +import java.net.DatagramPacket; +import java.util.Date; +import java.util.logging.ConsoleHandler; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.etsi.common.ByteHelper; +import org.etsi.its.pcapdump.CmdLineParser.IllegalOptionValueException; +import org.etsi.its.pcapdump.CmdLineParser.UnknownOptionException; + +/** + * @author yann + * + */ +public class pcapdump implements ILayer { + + /** + * Module version + */ + public static final String Version = "1.0.0.0"; + + /** + * Logger instance + */ + private final static Logger _logger = Logger.getLogger("org.etsi.its.pcapdump"); + + private static String NicAddr = "00FF6BADBFC2"; + + private static String FileName = "itsdump.pcapng"; + + /** + * Debug mode. Default: false + */ + private static Level Debug = Level.OFF; + + /** + * ITS Ehter type + */ + private static short FrameType = (short) 0x8947; + + /** + * Default ctor + */ + public pcapdump() { + // Nothing to do + } + + @Override + public void dispose() { + PcapMultiplexer.getInstance().unregister(this); + } + /** + * @param args + */ + public static void main(String[] args) { + // Process command line arguments + processCommandLine(args); + + // Set traces + _logger.addHandler(new ConsoleHandler()); + _logger.setLevel(Debug); + + + // Check if the file exist, never remove or scratch files + File file = new File(FileName); + if (file.exists()) { + File newFile = new File(FileName + "_" + System.currentTimeMillis()); + file.renameTo(newFile); + } + + ILayer layer = new pcapdump(); + PcapMultiplexer.getInstance(NicAddr); + PcapMultiplexer.getInstance().register(layer, FrameType); + + boolean bContinue = true; + while (bContinue) { + try { + // Check keyboard + if (System.in.available() > 0) { + int token = System.in.read(); + switch (token) { + case 'h': // Help + // No break; + case '?': // Help + cmdeLineUsage(); + break; + case 'q': + bContinue = false; + _logger.info("Terminate application..."); + break; + } // End of 'switch' statement + } + // Wait + java.lang.Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } // End of 'while' statement + + layer.dispose(); + System.err.println("Terminated"); + System.exit(0); + } + + /** + * Parse the command line and set options + * @param args Command line arguments + */ + private static void processCommandLine(String[] args) { + // Sanity checks + if (args.length == 0) { + return; + } + + CmdLineParser parser = new CmdLineParser(); + CmdLineParser.Option debug = parser.addBooleanOption("Debug"); + CmdLineParser.Option fileName = parser.addStringOption("FileName"); + CmdLineParser.Option frameType = parser.addStringOption("FrameType"); + CmdLineParser.Option NICAddr = parser.addStringOption("NicAddr"); + try { + parser.parse(args); + } catch (IllegalOptionValueException e) { + e.printStackTrace(); + printUsage(); + System.exit(2); + } catch (UnknownOptionException e) { + e.printStackTrace(); + printUsage(); + System.exit(3); + } + + Object value; + if ((value = parser.getOptionValue(debug, false)) != null) { + Debug = (((Boolean)value).booleanValue() == true) ? Level.ALL : Level.OFF; + } + if ((value = parser.getOptionValue(fileName, "")) != null) { + if (!((String)value).isEmpty()) { + FileName = (String)value; + } + } + if ((value = parser.getOptionValue(frameType, "")) != null) { + if (!((String)value).isEmpty()) { + FrameType = (short)Integer.parseInt((String)value, 16); + } + } + if ((value = parser.getOptionValue(NICAddr, "")) != null) { + if (!((String)value).isEmpty()) { + NicAddr = (String)value; + } + } + + } // End of method processCommandLine + + /** + * Display application usage + */ + private static void printUsage() { + System.err.println("Usage: [--Debug (default:false)]\n" + + " [--FileName=filename \"Output file name \"]\n" + + " [--FrameType=0x8947 \"Ethernet prototype\" (0x8947)]\n" + + " \n" + ); + } + + private static void cmdeLineUsage() { + System.err.println("Command Line Usage: \n" + + // TODO + " [q to exit]\n" + + " \n" + ); + + } + + @Override + public String getFileName() { + return FileName; + } + +} -- GitLab