/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 1 4 ĠAT & T Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . lip isoft . toy shark . session Ċ Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . ByteBuffer Ċ import Ġcom . lip isoft . toy shark . packet . Client Packet Writer Ċ import Ġcom . lip isoft . toy shark . packet . Packet Ċ import Ġcom . lip isoft . toy shark . packet . Packet Manager Ċ import Ġcom . lip isoft . toy shark . network . ip . IP Packet Factory Ċ import Ġcom . lip isoft . toy shark . network . ip . IPv 4 Header Ċ import Ġcom . lip isoft . toy shark . socket . Raw Packet Queue Ċ import Ġcom . lip isoft . toy shark . util . Packet Header Exception Ċ import Ġcom . lip isoft . toy shark . transport . tcp . TCP Header Ċ import Ġcom . lip isoft . toy shark . transport . tcp . TCP Packet Factory Ċ import Ġcom . lip isoft . toy shark . transport . udp . UDP Header Ċ import Ġcom . lip isoft . toy shark . transport . udp . UD PP acket Factory Ċ import Ġcom . lip isoft . toy shark . util . Packet Util Ċ import Ġandroid . util . Log Ċ import Ġcom . lip isoft . toy shark . util . Data Const . TCP Ċ import Ġcom . lip isoft . toy shark . util . Data Const . UDP Ċ Ċ /** Ċ Ġ* Ġhandle ĠVPN Ġclient Ġrequest Ġand Ġresponse . Ġit Ġcreate Ġa Ġnew Ġsession Ġfor Ġeach ĠVPN Ġclient . Ċ Ġ* Ċ Ġ* Ġ@ author ĠB ore y ĠS ao Ċ Ġ* ĠDate : ĠMay Ġ 2 2 , Ġ 2 0 1 4 Ċ Ġ*/ Ċ object ĠSession Handler Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Session Handler " ĊĠĠĠ Ġprivate Ġvar Ġwriter : ĠClient Packet Writer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġraw Packet Queue : ĠRaw Packet Queue Ġ= ĠRaw Packet Queue . instance ĊĊĠĠĠ Ġfun Ġset Writer ( writer : ĠClient Packet Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . writer Ġ= Ġwriter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVPN ĠClient ë¡ľ ë¶Ģ íĦ° ĠíĮ¨ í Ĥ · ìĿ´ Ġëĵ¤ ìĸ´ ìĻ Ķ ìĿĦ ë ķĮ , ĠTCP , ĠUDP Ġë³ Ħ ë¡ľ Ġì²ĺë¦¬ ĊĠĠĠĠ Ġ* Ġ@ param Ġstream ĠByteBuffer Ġto Ġbe Ġread ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Packet Header Exception :: class ) ĊĠĠĠ Ġfun Ġhandle Packet ( stream : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Packet Ġ= ĠByteArray ( stream . limit ()) ĊĊĠĠĠĠĠĠĠ Ġstream . get ( raw Packet , Ġ 0 , Ġstream . limit ()) ĊĠĠĠĠĠĠĠ Ġraw Packet Queue . add Packet ( raw Packet ) ĊĠĠĠĠĠĠĠ Ġstream . rewind () ĊĊĠĠĠĠĠĠĠ Ġ// ĠfileDescriptor Ġë¡ľ ë¶Ģ íĦ° Ġëĵ¤ ìĸ´ ìĺ ¨ Ġstream ĠìĿ Ħ ĠIPv 4 Ġíĺķ íĥľ ë¡ľ Ġë³Ģ íĻĺ ĊĠĠĠĠĠĠĠ Ġval Ġip Header Ġ= ĠIP Packet Factory . create IPv 4 Header ( stream ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠìľĦ ìĹĲìĦľ Ġë³Ģ íĻĺ ëĲľ Ġip Header Ġê°Ģ Ġtcp ĠìĿ¸ ì§Ģ Ġudp ĠìĿ¸ ì§Ģ ĠíĻķìĿ¸ íķĺëĬĶ Ġë¶Ģ ë¶Ħ ĊĠĠĠĠĠĠĠ Ġval Ġtransport Header Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Tcp Protocol ( ip Header ) Ġ-> ĠTCP Packet Factory . create TCP Header ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Udp Protocol ( ip Header ) Ġ-> ĠU D PP acket Factory . create UDP Header ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpacket Ġ= ĠPacket ( ip Header , Ġtransport Header , Ġstream . array ()) ĊĊĠĠĠĠĠĠĠ ĠPacket Manager . add ( packet ) ĊĠĠĠĠĠĠĠ ĠPacket Manager . handler . obtain Message ( Packet Manager . PACKET ). send To Target () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTCP ĠìĻ Ģ ĠUDP ĠìĹĲ ĠëĶ°ëĿ¼ ìĦľ Ġëĭ¤ ë¥´ ê²Į Ġstream ĠìĿ Ħ Ġì²ĺë¦¬ íķ¨ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( transport Header ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTCP Header Ġ-> Ġhandle TCP Packet ( stream , Ġip Header , Ġtransport Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUDP Header Ġ-> Ġhandle UD PP acket ( stream , Ġip Header , Ġtransport Header ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle TCP Packet ( stream : ĠByteBuffer , Ġip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header . is SYN Ġ-> Ġcreate Session And Reply Syn Ack ( ip Header , Ġtcp Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header . is ACK Ġ-> Ġprocess Session ( ip Header , Ġtcp Header , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header . is FIN Ġ-> Ġfinish Session ( ip Header , Ġtcp Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header . is RST Ġ-> Ġreset Connection ( ip Header , Ġtcp Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( ip Header , Ġtcp Header , Ġstream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Session And Reply Syn Ack ( ip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġip Header . identification Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġpacket Ġ= ĠTCP Packet Factory . create Syn Ack Packet Data ( ip Header , Ġtcp Header ) ĊĠĠĠĠĠĠĠ Ġval Ġtcp Packet Ġ= Ġpacket . transport Header Ġas ĠTCP Header ĊĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= ĠSession Manager . create TCP Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Ip Ġ= Ġip Header . destination IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Port Ġ= Ġtcp Header . destination Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Ip Ġ= Ġip Header . source IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Port Ġ= Ġtcp Header . source Port ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġwindow Scale Factor Ġ= ĠMath . pow ( 2 . 0 , Ġtcp Packet . window Scale . toDouble ()). toInt () ĊĠĠĠĠĠĠĠ Ġsession . set Send Window Size And Scale ( tcp Packet . window Size , Ġwindow Scale Factor ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" send - window Ġsize : Ġ" Ġ+ Ġsession . send Window ) ĊĊĠĠĠĠĠĠĠ Ġsession . max Segment Size Ġ= Ġtcp Packet . max Segment Size ĊĠĠĠĠĠĠĠ Ġsession . send Un Ack Ġ= Ġtcp Packet . sequence Number ĊĠĠĠĠĠĠĠ Ġsession . send Next Ġ= Ġtcp Packet . sequence Number Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġsession . rec Sequence Ġ= Ġtcp Packet . ack Number ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter ?. write ( packet . buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Packet Queue . add Packet ( packet . buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Send ĠSYN - ACK Ġto Ġclient ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġsending Ġdata Ġto Ġclient : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Session ( ip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header , Ġstream : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Length Ġ= Ġstream . limit () Ġ- Ġstream . position () ĊĊĠĠĠĠĠĠĠ Ġval Ġdest Ip Ġ= Ġip Header . destination IP ĊĠĠĠĠĠĠĠ Ġval Ġdest Port Ġ= Ġtcp Header . destination Port ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ip Ġ= Ġip Header . source IP ĊĠĠĠĠĠĠĠ Ġval Ġsrc Port Ġ= Ġtcp Header . source Port ĊĊĠĠĠĠĠĠĠ Ġ// Ġí Ĥ¤ Ġíĺķ íĥľ : Ġ 1 1 1 . 1 1 1 1 . 1 1 1 . 1 1 1 : 8 0 - 2 2 2 . 2 2 2 . 2 2 2 . 2 2 2 : 8 0 ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠSession Manager . create Key ( dest Ip , Ġdest Port , Ġsrc Ip , Ġsrc Port ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ{ key : Ġ" 1 1 1 . 1 1 1 1 . 1 1 1 . 1 1 1 : 8 0 - 2 2 2 . 2 2 2 . 2 2 2 . 2 2 2 : 8 0 ", Ġvalue : ĠìĦ¸ ìħĺ } ë¡ľ Ġëĵ¤ ìĸ´ ê°Ģ ìŀ Ī ìĿĮ ĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= ĠSession Manager . getSession ByKey ( key ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( session Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tcp Header . is FIN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Last Ack ( ip Header , Ġtcp Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ(! tcp Header . is RST ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend R st ( ip Header , Ġtcp Header , Ġdata Length ) Ġ// Ġê° ķ ìłľ Ġì¢ ħ ë£Į ĠíĮ¨ í Ĥ · ĠìłĦ ëĭ ¬ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsession . last Ip Header Ġ= Ġip Header ĊĠĠĠĠĠĠĠ Ġsession . last Tcp Header Ġ= Ġtcp Header ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Client Data ( data Length )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNew Data Added ( session , Ġtcp Header )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadded Length Ġ= ĠSession Manager . add Client Data ( stream , Ġsession ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Ack ( ip Header , Ġtcp Header , Ġadded Length , Ġsession ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Ack For Dis order ( ip Header , Ġtcp Header , Ġdata Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġan Ġack Ġfrom Ġclient Ġfor Ġpreviously Ġsent Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Ack ( tcp Header , Ġsession ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( session . is Closing Connection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Fin Ack ( ip Header , Ġtcp Header , Ġsession ) Ġ// Ġì¢ ħ ë£Į ë¥¼ ĠìľĦíķ´ ĠFin Ack ë¥¼ Ġë³ ´ë ĥ Ħ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( session . is Ack To Fin Ġ&& Ġ! tcp Header . is FIN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġlast ĠACK Ġfrom Ġclient Ġafter ĠFIN - ACK Ġflag Ġwas Ġsent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Manager . close Session ( dest Ip , Ġdest Port , Ġsrc Ip , Ġsrc Port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" got Ġlast ĠACK Ġafter ĠFIN , Ġsession Ġis Ġnow Ġclosed .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġreceived Ġthe Ġlast Ġsegment Ġof Ġdata Ġfrom Ġv pn Ġclient ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header . is P SH Ġ-> Ġpush DataTo Destination ( session , Ġtcp Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header . is FIN Ġ-> Ġreply Fin Ack ( session , Ġip Header , Ġtcp Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header . is RST Ġ-> Ġreset Connection ( ip Header , Ġtcp Header ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! session . is Client Window Full Ġ&& Ġ! session . is Abort ing Connection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSession Manager . keep Session Alive ( session ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish Session ( ip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcase Ġclient Ġsent ĠFIN Ġwithout ĠACK ĊĠĠĠĠĠĠĠ ĠSession Manager . getSession ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Ip Ġ= Ġip Header . destination IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Port Ġ= Ġtcp Header . destination Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Ip Ġ= Ġip Header . source IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Port Ġ= Ġtcp Header . source Port ĊĠĠĠĠĠĠĠ Ġ) Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSession Manager . keep Session Alive ( it ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreply Fin Ack ( null , Ġip Header , Ġtcp Header ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Connection ( ip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSession Manager . getSession ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Ip Ġ= Ġip Header . destination IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Port Ġ= Ġtcp Header . destination Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Ip Ġ= Ġip Header . source IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Port Ġ= Ġtcp Header . source Port ĊĠĠĠĠĠĠĠ Ġ) Ġ? . apply Ġ{ Ġis Abort ing Connection Ġ= Ġtrue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Tcp Protocol ( ip Header : ĠIPv 4 Header ) Ġ= Ġip Header . protocol Ġ== ĠTCP ĊĊĠĠĠ Ġprivate Ġfun Ġis Udp Protocol ( ip Header : ĠIPv 4 Header ) Ġ= Ġip Header . protocol Ġ== ĠUDP ĊĊĠĠĠ Ġprivate Ġfun Ġis New Data Added ( session : ĠSession , Ġtcp Header : ĠTCP Header ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . rec Sequence Ġ== Ġ 0 L Ġ|| Ġtcp Header . sequence Number Ġ>= Ġsession . rec Sequence ĊĊĠĠĠ Ġprivate Ġfun Ġerror ( ip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header , Ġstream : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" unknown ĠTCP Ġflag ") ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĠPacket Util . get TCP Output ( ip Header , Ġtcp Header , Ġstream . array ()) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" >>>>>>>> ĠReceived Ġfrom Ġclient Ġ<< <<<<<<<< ") ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġoutput ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" >>>>>>>> >>>>>>>> >>> end Ġreceiving Ġfrom Ġclient >>>>>>>> >>>>>>>> >> >>> ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle UD PP acket ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream : ĠByteBuffer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip Header : ĠIPv 4 Header , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġudp Header : ĠUDP Header ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= ĠSession Manager . getSession ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Ip Ġ= Ġip Header . destination IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Port Ġ= Ġudp Header . destination Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Ip Ġ= Ġip Header . source IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Port Ġ= Ġudp Header . source Port ĊĠĠĠĠĠĠĠ Ġ) Ġ?: ĠSession Manager . create UDP Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Ip Ġ= Ġip Header . destination IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest Port Ġ= Ġudp Header . destination Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Ip Ġ= Ġip Header . source IP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Port Ġ= Ġudp Header . source Port ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġsession . last Ip Header Ġ= Ġip Header ĊĠĠĠĠĠĠĠ Ġsession . last Udp Header Ġ= Ġudp Header ĊĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= ĠSession Manager . add Client Data ( stream , Ġsession ) ĊĠĠĠĠĠĠĠ Ġsession . is Data For Sending Ready Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" added ĠUDP Ġdata Ġfor Ġbg Ġworker Ġto Ġsend : Ġ$ length ") ĊĠĠĠĠĠĠĠ ĠSession Manager . keep Session Alive ( session ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend R st ( ip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header , Ġdata Length : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠTCP Packet Factory . create R st Data ( ip Header , Ġtcp Header , Ġdata Length ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter ?. write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Packet Queue . add Packet ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Sent ĠR ST ĠPacket Ġto Ġclient Ġwith Ġdest Ġ=> Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPacket Util . int To IPAddress ( ip Header . destination IP ) Ġ+ Ġ":" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header . destination Port ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" failed Ġto Ġsend ĠR ST Ġpacket : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Last Ack ( ip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠTCP Packet Factory . create Response Ack Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Header Ġ= Ġip Header , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header Ġ= Ġtcp Header , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġack To Client Ġ= Ġtcp Header . sequence Number Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter ?. write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Packet Queue . add Packet ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Sent Ġlast ĠACK ĠPacket Ġto Ġclient Ġwith Ġdest Ġ=> Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPacket Util . int To IPAddress ( ip Header . destination IP ) Ġ+ Ġ":" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header . destination Port ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" failed Ġto Ġsend Ġlast ĠACK Ġpacket : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreply Fin Ack ( session : ĠSession ?, Ġip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġack Ġ= Ġtcp Header . sequence Number Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġseq Ġ= Ġtcp Header . ack Number ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠTCP Packet Factory . create Fin Ack Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Pv 4 Header Ġ= Ġip Header , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header Ġ= Ġtcp Header , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġack To Client Ġ= Ġack , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseq To Client Ġ= Ġseq , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Fin Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ack Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter ?. write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Packet Queue . add Packet ( data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( session Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . selection Key ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSession Manager . close Session ( session ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" ACK Ġto Ġclient 's ĠFIN Ġand Ġclose Ġsession Ġ=> Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠPacket Util . int To IPAddress ( ip Header . destination IP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ":" Ġ+ Ġtcp Header . destination Port ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ"-" Ġ+ ĠPacket Util . int To IPAddress ( ip Header . source IP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ":" Ġ+ Ġtcp Header . source Port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Fin Ack ( ip Header : ĠIPv 4 Header , Ġtcp Header : ĠTCP Header , Ġsession : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġack Ġ= Ġtcp Header . sequence Number ĊĠĠĠĠĠĠĠ Ġval Ġseq Ġ= Ġtcp Header . ack Number ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠTCP Packet Factory . create Fin Ack Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Pv 4 Header Ġ= Ġip Header , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header Ġ= Ġtcp Header , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġack To Client Ġ= Ġack , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseq To Client Ġ= Ġseq , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Fin Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ack Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠByteBuffer . wrap ( data ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter ?. write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Packet Queue . add Packet ( data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" 0 0 0 0 0 0 0 0 0 0 0 ĠFIN - ACK Ġpacket Ġdata Ġto Ġv pn Ġclient Ġ 0 0 0 0 0 0 0 0 0 0 0 0 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv pn Ip : ĠIPv 4 Header ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv pn Ip Ġ= ĠIP Packet Factory . create IPv 4 Header ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPacket Header Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġv pn Tcp : ĠTCP Header ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vpn Ip Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv pn Tcp Ġ= ĠTCP Packet Factory . create TCP Header ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPacket Header Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vpn Ip Ġ!= Ġnull Ġ&& Ġv pn Tcp Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠPacket Util . get TCP Output ( vpn Ip , Ġv pn Tcp , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" 0 0 0 0 0 0 0 0 0 0 0 0 0 Ġfinished Ġsending ĠFIN - ACK Ġpacket Ġto Ġv pn Ġclient Ġ 0 0 0 0 0 0 0 0 0 0 0 0 ") ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġsend ĠACK Ġpacket : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsession . send Next Ġ= Ġseq Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// Ġavoid Ġre - sending Ġit , Ġfrom Ġhere Ġclient Ġshould Ġtake Ġcare Ġthe Ġrest ĊĠĠĠĠĠĠĠ Ġsession . is Closing Connection Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpush DataTo Destination ( session : ĠSession , Ġtcp : ĠTCP Header ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsession . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Data For Sending Ready Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Reply To Ġ= Ġtcp . time Stamp Sender ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Sender Ġ= ĠSystem . currentTimeMillis (). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" set Ġdata Ġready Ġfor Ġsending Ġto Ġdest , Ġbg Ġwill Ġdo Ġit . Ġdata Ġsize : Ġ${ session . getS ending DataSize () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsend Ġacknowled gment Ġpacket Ġto ĠVPN Ġclient ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsend Ack ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip Header : ĠIPv 4 Header , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header : ĠTCP Header , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccepted Data Length : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession : ĠSession ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġack Number Ġ= Ġsession . rec Sequence Ġ+ Ġaccepted Data Length ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" sent Ġack , Ġack # Ġ" Ġ+ Ġsession . rec Sequence Ġ+ Ġ" Ġ+ Ġ" Ġ+ Ġaccepted Data Length Ġ+ Ġ" Ġ= Ġ" Ġ+ Ġack Number ) ĊĠĠĠĠĠĠĠ Ġsession . rec Sequence Ġ= Ġack Number ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠTCP Packet Factory . create Response Ack Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Header Ġ= Ġip Header , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header Ġ= Ġtcp Header , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġack To Client Ġ= Ġack Number ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter ?. write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Packet Queue . add Packet ( data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġsend ĠACK Ġpacket : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Ack For Dis order ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip Header : ĠIPv 4 Header , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtcp Header : ĠTCP Header , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccepted Data Length : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġack Number Ġ= Ġtcp Header . sequence Number Ġ+ Ġaccepted Data Length ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" sent Ġack , Ġack # Ġ" Ġ+ Ġtcp Header . sequence Number Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ+ Ġ" Ġ+ Ġaccepted Data Length Ġ+ Ġ" Ġ= Ġ" Ġ+ Ġack Number ) ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠTCP Packet Factory . create Response Ack Data ( ip Header , Ġtcp Header , Ġack Number ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter ?. write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġraw Packet Queue . add Packet ( data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġsend ĠACK Ġpacket : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġacknowledge Ġa Ġpacket Ġand Ġadjust Ġthe Ġreceiving Ġwindow Ġto Ġavoid Ġcon gestion . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġaccept Ack ( tcp Header : ĠTCP Header , Ġsession : ĠSession ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Cor rupted Ġ= ĠPacket Util . is Packet Cor rupted ( tcp Header ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Cor rupted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" prev Ġpacket Ġwas Ġcorrupted , Ġlast Ġack # Ġ" Ġ+ Ġtcp Header . ack Number ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tcp Header . ack Number Ġ> Ġsession . send Un Ack Ġ|| Ġtcp Header . ack Number Ġ== Ġsession . send Next ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . is Ack Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tcp Header . window Size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . set Send Window Size And Scale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Window Size Ġ= Ġtcp Header . window Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Window Scale Ġ= Ġsession . send Window Scale ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Un Ack Ġ= Ġtcp Header . ack Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrec Sequence Ġ= Ġtcp Header . sequence Number ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Reply To Ġ= Ġtcp Header . time Stamp Sender ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Sender Ġ= ĠSystem . currentTimeMillis (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Not ĠAccept ing Ġack # Ġ" Ġ+ Ġtcp Header . ack Number Ġ+ Ġ" Ġ, Ġit Ġshould Ġbe : Ġ" Ġ+ Ġsession . send Next ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Prev Ġsend Un ack : Ġ" Ġ+ Ġsession . send Un Ack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . is Ack Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Client Data ( data Length : ĠInt ) Ġ= Ġdata Length Ġ> Ġ 0 Ċ Ċ } Ċ