package Ġbe . my god . vpn hot spot . net Ċ Ċ import Ġandroid . os . Build Ċ import Ġbe . my god . vpn hot spot . App . Companion . app Ċ import Ġbe . my god . vpn hot spot . R Ċ import Ġbe . my god . vpn hot spot . net . monitor . Fallback Upstream Monitor Ċ import Ġbe . my god . vpn hot spot . net . monitor . Traffic Recorder Ċ import Ġbe . my god . vpn hot spot . net . monitor . Upstream Monitor Ċ import Ġbe . my god . vpn hot spot . util . Root Session Ċ import Ġbe . my god . vpn hot spot . widget . Smart Snackbar Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . lang . RuntimeException Ċ import Ġjava . net .* Ċ Ċ /** Ċ Ġ* ĠA Ġtransaction Ġwrapper Ġthat Ġhelps Ġset Ġup Ġrouting Ġenvironment . Ċ Ġ* Ċ Ġ* ĠOnce Ġrevert Ġis Ġcalled , Ġthis Ġobject Ġno Ġlonger Ġserves Ġany Ġpurpose . Ċ Ġ*/ Ċ class ĠRouting ( val Ġdownstream : ĠString , Ġowner Address : ĠInterface Address ? Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSince ĠAndroid Ġ 5 . 0 , ĠRULE _ PRIORITY _ T ETHER ING Ġ= Ġ 1 8 0 0 0 . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġalso Ġworks Ġfor ĠWi - Fi Ġdirect Ġwhere Ġthere 's Ġno Ġrule Ġat Ġ 1 8 0 0 0 . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠSource : Ġhttps :// android . google source . com / platform / system / net d / +/ b 9 baf 2 6 / server / Route Controller . cpp # 6 5 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRULE _ PRIORITY _ UP STREAM Ġ= Ġ 1 7 8 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRULE _ PRIORITY _ UP STREAM _ FALL BACK Ġ= Ġ 1 7 9 0 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ- w Ġ< seconds > Ġis Ġnot Ġsupported Ġon Ġ 7 . 1 -. ĊĠĠĠĠĠĠĠĠ Ġ* ĠFort un ately Ġthere Ġalso Ġisn 't Ġa Ġtime Ġlimit Ġfor Ġstarting Ġa Ġforeground Ġservice Ġback Ġin Ġ 7 . 1 -. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠSource : Ġhttps :// android . google source . com / platform / external / ipt ables / +/ android - 5 . 0 . 0 _ r 1 / ipt ables / ipt ables . c # 1 5 7 4 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠIPT ABLE S Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 6 ) Ġ" ipt ables Ġ- w Ġ 1 " Ġelse Ġ" ipt ables Ġ- w " ĊĊĠĠĠĠĠĠĠ Ġfun Ġclean () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTraffic Recorder . clean () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoot Session . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet ("$ IP TABLE S Ġ- t Ġnat Ġ- F ĠPR ER OUT ING ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet (" while Ġ$ IP TABLE S Ġ- D ĠFOR WARD Ġ- j Ġv pn hot spot _ fwd ; Ġdo Ġdone ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet ("$ IP TABLE S Ġ- F Ġv pn hot spot _ fwd ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet ("$ IP TABLE S Ġ- X Ġv pn hot spot _ fwd ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet (" while Ġ$ IP TABLE S Ġ- t Ġnat Ġ- D ĠPOST ROUT ING Ġ- j Ġv pn hot spot _ mas quer ade ; Ġdo Ġdone ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet ("$ IP TABLE S Ġ- t Ġnat Ġ- F Ġv pn hot spot _ mas quer ade ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet ("$ IP TABLE S Ġ- t Ġnat Ġ- X Ġv pn hot spot _ mas quer ade ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet (" while Ġip Ġrule Ġdel Ġpriority Ġ$ RULE _ PRIORITY _ UP STREAM ; Ġdo Ġdone ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet (" while Ġip Ġrule Ġdel Ġpriority Ġ$ RULE _ PRIORITY _ UP STREAM _ FALL BACK ; Ġdo Ġdone ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exec Quiet (" while Ġip Ġrule Ġdel Ġi if Ġlo Ġuid range Ġ 0 - 0 Ġlookup Ġlocal _ network Ġpriority Ġ 1 1 0 0 0 ; Ġdo Ġdone ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠRoot Session . Transaction . ipt ables Add ( content : ĠString , Ġtable : ĠString Ġ= Ġ" filter ") Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec ("$ IP TABLE S Ġ- t Ġ$ table Ġ- A Ġ$ content ", Ġ"$ IP TABLE S Ġ- t Ġ$ table Ġ- D Ġ$ content ") ĊĠĠĠĠĠĠĠ Ġfun ĠRoot Session . Transaction . ipt ables Insert ( content : ĠString , Ġtable : ĠString Ġ= Ġ" filter ") Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexec ("$ IP TABLE S Ġ- t Ġ$ table Ġ- I Ġ$ content ", Ġ"$ IP TABLE S Ġ- t Ġ$ table Ġ- D Ġ$ content ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠInterface NotFoundException Ġ: ĠSocket Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġmessage : ĠString Ġget () Ġ= Ġapp . getString ( R . string . exception _ interface _ not _ found ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġhost Address Ġ= Ġowner Address Ġ?: ĠNetwork Interface . get ByName ( down stream )?. interface Addresses ?. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . single OrNull Ġ{ Ġit . address Ġis ĠInet 4 Address Ġ} Ġ?: Ġthrow ĠInterface NotFoundException () ĊĠĠĠ Ġval Ġhost Subnet Ġ= Ġ"${ host Address . address . host Address }/${ host Address . network Prefix Length }" ĊĠĠĠ Ġprivate Ġval Ġtransaction Ġ= ĠRoot Session . beginTransaction () ĊĊĠĠĠ Ġvar Ġhas Mas quer ade Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġup streams Ġ= ĠHashSet < String >() ĊĠĠĠ Ġprivate Ġopen Ġinner Ġclass ĠUp stream ( val Ġpriority : ĠInt ) Ġ: ĠUp stream Monitor . Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsub routing : ĠSub routing ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġdns : ĠList < Inet Address > Ġ= Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Available ( if name : ĠString , Ġdns : ĠList < Inet Address >) Ġ= Ġsynchronized ( this @ Routing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! up streams . add ( if name )) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub routing Ġ= Ġsub routing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sub routing Ġ== Ġnull ) Ġthis . sub routing Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub routing ( this @ Routing , Ġpriority , Ġif name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSmart Snackbar . make ( e ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġcheck ( sub routing . upstream Ġ== Ġif name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dns Ġ= Ġdns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Dns Route () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Lost () Ġ= Ġsynchronized ( this @ Routing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub routing Ġ= Ġsub routing Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( up streams . remove ( sub routing . upstream )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub routing . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTraffic Recorder . update () ĠĠĠ Ġ// Ġrecord Ġstats Ġbefore Ġremoving Ġrules Ġto Ġprevent Ġstats Ġlo sing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub routing . revert () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . sub routing Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdns Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Dns Route () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġfallback Upstream Ġ= Ġobject Ġ: ĠUp stream ( RULE _ PRIORITY _ UP STREAM _ FALL BACK ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Fallback () Ġ= Ġsynchronized ( this @ Routing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( sub routing Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub routing Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSub routing ( this @ Routing , Ġpriority ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSmart Snackbar . make ( e ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Dns Route () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġupstream Ġ= ĠUp stream ( RULE _ PRIORITY _ UP STREAM ) ĊĊĠĠĠ Ġfun Ġip Forward () Ġ= Ġtransaction . exec (" echo Ġ 1 Ġ>/ proc / sys / net / ipv 4 / ip _ forward ") ĊĊĠĠĠ Ġfun Ġdisable Ipv 6 () Ġ= Ġtransaction . exec (" echo Ġ 1 Ġ>/ proc / sys / net / ipv 6 / conf /$ down stream / disable _ ipv 6 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" echo Ġ 0 Ġ>/ proc / sys / net / ipv 6 / conf /$ down stream / disable _ ipv 6 ") ĊĊĠĠĠ Ġfun Ġforward () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction . exec Quiet ("$ IP TABLE S Ġ- N Ġv pn hot spot _ fwd ") ĊĠĠĠĠĠĠĠ Ġtransaction . ipt ables Insert (" FORWARD Ġ- j Ġv pn hot spot _ fwd ") ĊĠĠĠĠĠĠĠ Ġtransaction . ipt ables Add (" vpn hot spot _ fwd Ġ- i Ġ$ down stream Ġ! Ġ- o Ġ$ down stream Ġ- j ĠDROP ") ĠĠ Ġ// Ġensure Ġblocking Ġworks ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġreal Ġforwarding Ġfilters Ġwill Ġbe Ġadded Ġin ĠSub routing Ġwhen Ġclients Ġare Ġconnected ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmas quer ade () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction . exec Quiet ("$ IP TABLE S Ġ- t Ġnat Ġ- N Ġv pn hot spot _ mas quer ade ") ĊĠĠĠĠĠĠĠ Ġtransaction . ipt ables Insert (" POST ROUT ING Ġ- j Ġv pn hot spot _ mas quer ade ", Ġ" nat ") ĊĠĠĠĠĠĠĠ Ġhas Mas quer ade Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ// Ġfurther Ġrules Ġare Ġadded Ġwhen Ġup streams Ġare Ġfound ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠD ns Route ( val Ġdns : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= ĠRoot Session . beginTransaction (). safe guard Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost Address Ġ= Ġhost Address . address . host Address ĊĠĠĠĠĠĠĠĠĠĠĠ Ġipt ables Add (" PR ER OUT ING Ġ- i Ġ$ down stream Ġ- p Ġtcp Ġ- d Ġ$ host Address Ġ-- d port Ġ 5 3 Ġ- j ĠD NAT Ġ-- to - destination Ġ$ dns ", Ġ" nat ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġipt ables Add (" PR ER OUT ING Ġ- i Ġ$ down stream Ġ- p Ġudp Ġ- d Ġ$ host Address Ġ-- d port Ġ 5 3 Ġ- j ĠD NAT Ġ-- to - destination Ġ$ dns ", Ġ" nat ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġcurrent Dns : ĠD ns Route ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġfun Ġupdate Dns Route () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdns Ġ= Ġ( upstream . dns Ġ+ Ġfallback Upstream . dns ). first OrNull Ġ{ Ġit Ġis ĠInet 4 Address Ġ} ?. host Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġapp . pref . getString (" service . dns ", Ġ" 8 . 8 . 8 . 8 ") ĊĠĠĠĠĠĠĠ Ġif Ġ( dns Ġ!= Ġcurrent Dns ?. dns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dns ?. transaction ?. revert () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dns Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD ns Route ( dns ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSmart Snackbar . make ( e ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSimilar ly , Ġassuming ĠRULE _ PRIORITY _ VPN _ OUTPUT _ TO _ LOCAL Ġ= Ġ 1 1 0 0 0 . ĊĠĠĠĠ Ġ* ĠNorm ally Ġthis Ġis Ġused Ġto Ġforward Ġpackets Ġfrom Ġremote Ġto Ġlocal , Ġbut Ġit Ġworks Ġany ways . ĠIt Ġjust Ġneeds Ġto Ġbe Ġbefore ĊĠĠĠĠ Ġ* ĠRULE _ PRIORITY _ SECURE _ VPN Ġ= Ġ 1 2 0 0 0 . ĠIt Ġwould Ġbe Ġgreat Ġif Ġwe Ġcan Ġgain Ġbetter Ġunderstanding Ġinto Ġwhy Ġthis Ġis Ġonly ĊĠĠĠĠ Ġ* Ġneeded Ġon Ġsome Ġof Ġthe Ġdevices Ġbut Ġnot Ġothers . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSource : Ġhttps :// android . google source . com / platform / system / net d / +/ b 9 baf 2 6 / server / Route Controller . cpp # 5 7 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdh cp Work around () Ġ= Ġtransaction . exec (" ip Ġrule Ġadd Ġi if Ġlo Ġuid range Ġ 0 - 0 Ġlookup Ġlocal _ network Ġpriority Ġ 1 1 0 0 0 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ip Ġrule Ġdel Ġi if Ġlo Ġuid range Ġ 0 - 0 Ġlookup Ġlocal _ network Ġpriority Ġ 1 1 0 0 0 ") ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ ĠF allback Upstream Monitor . unregister Callback ( fallback Upstream ) ĊĠĠĠĠĠĠĠ Ġfallback Upstream . sub routing ?. close () ĊĠĠĠĠĠĠĠ ĠUp stream Monitor . unregister Callback ( upstream ) ĊĠĠĠĠĠĠĠ Ġupstream . sub routing ?. close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcommit () Ġ{ ĊĠĠĠĠĠĠĠ Ġtransaction . commit () ĊĠĠĠĠĠĠĠ ĠF allback Upstream Monitor . register Callback ( fallback Upstream ) ĊĠĠĠĠĠĠĠ ĠUp stream Monitor . register Callback ( upstream ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġrevert () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ ĠTraffic Recorder . update () ĠĠĠ Ġ// Ġrecord Ġstats Ġbefore Ġexiting Ġto Ġprevent Ġstats Ġlo sing ĊĠĠĠĠĠĠĠ Ġfallback Upstream . sub routing ?. revert () ĊĠĠĠĠĠĠĠ Ġupstream . sub routing ?. revert () ĊĠĠĠĠĠĠĠ Ġtransaction . revert () ĊĠĠĠ Ġ} Ċ } Ċ