/* Ċ Ġ* ĠCopyright Ġ@ Ġ 2 0 1 8 ĠAt lassian ĠP ty ĠLtd Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . j its i . nl j . transform . node Ċ Ċ import Ġorg . j its i . nl j . Packet Info Ċ import Ġorg . j its i . nl j . stats . Node Stats Block Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠRandom ly Ġdrops Ġpackets Ġat Ġa Ġrate Ġof Ġ[ loss Rate ]. Ċ Ġ*/ Ċ class ĠPacket Loss ( private Ġval Ġloss Rate : ĠDouble ) Ġ: ĠNode (" Packet Ġloss ") Ġ{ ĊĠĠĠ Ġprivate Ġval Ġrandom Ġ= ĠRandom () ĊĠĠĠ Ġprivate Ġvar Ġpackets Seen Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġpackets Dropped Ġ= Ġ 0 ĊĠĠĠ Ġoverride Ġfun Ġdo Process Packets ( p : ĠList < Packet Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġpackets Seen Ġ+= Ġp . size ĊĠĠĠĠĠĠĠ Ġval Ġforwarded Packets Ġ= Ġp . filter Ġ{ Ġrandom . next Double () Ġ> Ġloss Rate Ġ} ĊĠĠĠĠĠĠĠ Ġpackets Dropped Ġ+= Ġ( p . size Ġ- Ġforwarded Packets . size ) ĊĠĠĠĠĠĠĠ Ġnext ( for warded Packets ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetNode Stats (): ĠNode Stats Block Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Stats Ġ= Ġsuper . getNode Stats () ĊĠĠĠĠĠĠĠ Ġreturn ĠNode Stats Block ( name ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( parent Stats ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Stat (" configured Ġdrop Ġrate : Ġ$ loss Rate , Ġactual Ġdrop Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" rate : Ġ${ packets Dropped Ġ/ Ġpackets Seen . toDouble () }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠBur st Packet Loss ( ĊĠĠĠ Ġprivate Ġval Ġburst Size : ĠInt Ġ= Ġ 3 0 , ĊĠĠĠ Ġprivate Ġval Ġburst Interval : ĠInt Ġ= Ġ 3 0 0 0 Ċ ) Ġ: ĠNode (" Bur st Ġpacket Ġloss ") Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġpackets Seen Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtotal Packets Dropped Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġin Bur st Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcurrent Bur st Packets Dropped Ġ= Ġ 0 ĊĊĊĠĠĠ Ġoverride Ġfun Ġdo Process Packets ( p : ĠList < Packet Info >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Packets Ġ= Ġmutable ListOf < Packet Info >() ĊĠĠĠĠĠĠĠ Ġp . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackets Seen ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( packets Seen Ġ% Ġburst Interval Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Bur st Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( in Bur st ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Bur st Packets Dropped ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Bur st Packets Dropped Ġ== Ġburst Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Bur st Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Packets . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnext ( out Packets ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ