™N ΕΩ©BcsŒkZkZkZkZkZkZkZd„Zd„Zd„Z dei fd„ƒYZ d„Z d„Z edjo e ƒndS( cs)|i}|i|i|i|ifSdS(N(sipsdatastcpssrcssportsdstsdport(sipstcps./jmpc/python/acklimit.pysgetkey$s csB||}|dd ddjo||dd}n|SdS(Nii i(sackbsackasr(sackasackbsrs./jmpc/python/acklimit.pys calcackbytes(s csVtt|ƒt|ƒƒ}|djo|Snd„}t||ƒ||ƒƒSdS(Nics|ii|ii|iifS(N(sxsdatasseqsack(sxs./jmpc/python/acklimit.pys5s(scmpsgetkeysasbsrsf(sasbsrsfs./jmpc/python/acklimit.pyscmpiptcp.s   sacklimitcsMd„Zd„Zd„Zd„Zd„Zed„Zd„Zd„ZRS( Nc s^||_h|_g|_t|_d|_ddd|_tt i i ||f|ƒdS(Niii<(s bytespersecsselfsconsspendingsTruesupdateltslasttimeswaittimesapplysdivertsDiverts__init__sportskwargs(sselfsports bytespersecskwargss./jmpc/python/acklimit.pys__init__9s     cs@tiƒ}||idjotSn|i||_tSdS(Ni(stimescurtsselfslasttimesTrueswaittimesFalse(sselfsbytesscurts./jmpc/python/acklimit.pyscansendBs  csA|iotiƒ}n |i}|t|ƒ|i|_dS(N(sselfsupdateltstimesbtslasttimesfloatsbytess bytespersec(sselfsbytessbts./jmpc/python/acklimit.pysnewtimeJs  c s#|i}t|ƒ}yΕ|i|\}}t ||i ƒ}|djo|i t |ƒ|ƒnvt}x7|dr-\} }t| |ƒdjo t}PnqsW| o-||f} |ii| ƒ|i| ƒnWnBtj o6|ii gf|i|<|i t |ƒ|ƒnXdS(Ni(sipsdatastcpsgetkeyskeysselfsconsslastackspqueues calcackbytessacksackbytesssendpktsstrsaddrsFalsesmatsbscmpiptcpsTruesispendingsappendsKeyError( sselfsipsaddrstcpskeyslastackspqueuesackbytessmatsbsis./jmpc/python/acklimit.pysdotcpackQs*      csxμ|ioα|id\}}|i}t|ƒ}|i|\}}t ||i ƒ}|djo|it|ƒ|ƒn@|i|ƒ oPn|i|ƒ|it|ƒƒt|_|ii |f|i|<|id=|d=qW|i oddd|_t|_ndS(Niii<(sselfspendingsipsaddrsdatastcpsgetkeyskeysconsslastackspqueues calcackbytessacksackbytesssendpktsstrscansendsnewtimesFalsesupdateltswaittimesTrue(sselfsipsaddrstcpskeyslastackspqueuesackbytess./jmpc/python/acklimit.pys checkpendingks(         cs tii|||ƒ}|SdS(N(sdivertsDivertssendpktsselfsbufsaddrsret(sselfsbufsaddrsrets./jmpc/python/acklimit.pyssendpktscs'x |dr}|ii|ƒq WdS(Ni(spqueuesisselfspendingsremove(sselfspqueuesis./jmpc/python/acklimit.pys droppendingˆs csπtii|ƒ}t}t|itii ƒo |ii tii @oTy:t |ƒ}|i|\}}|i|ƒ|i|=Wntj onXn2|ii tii@o|i||ƒt}nn|o|i||ƒndS(N(sdpktsipsIPsbufsTruesechopkts isinstancesdatastcpsTCPsflagssTH_FINsgetkeyskeysselfsconsslastackspqueues droppendingsKeyErrorsTH_ACKsdotcpacksaddrsFalsessendpkt(sselfsbufsaddrsipsechopktskeyslastackspqueues./jmpc/python/acklimit.pys handlepktŒs    ( s__init__scansendsnewtimesdotcpacks checkpendingsNonessendpkts droppendings handlepkt(s./jmpc/python/acklimit.pysacklimit8s      cstiidƒdS(Ns1Usage: acklimit -p -b (ssyssstderrswrite(s./jmpc/python/acklimit.pysusageŸscsMy)titidddgƒ\}}Wn*tij otƒtidƒnXt}t}x~|drt\}}|ddfjotƒtiƒnA|dfjot |ƒ}n!|d fjot |ƒ}nqkW| p| otƒtidƒnt||d tƒ}x&to|iƒ|i|iƒq#WdS( Nisb:hp:shelpiis-hs--helps-ps-bsblock(sgetoptssyssargvsoptssargss GetoptErrorsusagesexitsNonesdvrtprts bytespersecsosasintsacklimitsFalsesdsTrues checkpendingscheckandhandleswaittime(soptssargssdvrtprts bytespersecsosasds./jmpc/python/acklimit.pysmain’s0)  s__main__N(scopysdivertsdpktsgetoptsmathstimessyssgetkeys calcackbytesscmpiptcpsDivertsacklimitsusagesmains__name__(s./jmpc/python/acklimit.pys?s   g