03i/ lddlmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z e ejZdZdZdZdZd Zd Zd Zd Zd ZdZdZdZe dGddZeddddedz eddddedz eddd d!edz d"Zd`d%Z dad)Z!dbdcd/Z"ddd0Z#ded3Z$dfd7Z%dgd9Z&dhd:Z'dhd;Z(did=Z)djd?Z*dkdBZ+dldEZ,dmdndMZ-dodNZ.dpdPZ/dqdRZ0drdUZ1dsdYZ2dtd\Z3dud]Z4dvd^Z5e6d_kre7e5dS)w) annotationsN) dataclass)Pathz /opt/ptp_confz/home/apu/wifi-ptp/ptp/ptp4lz&/opt/timestamping/receiver_hwts_loggerzC/home/apu/testbed_files/experiments/reference_broadcast/broadcasterzptp4l_grandmaster.confzptp4l_slave.confz/tmp/ptp4l_grandmaster.logz/tmp/ptp4l_slave.logz/tmp/phc2sys_eth0_sync.logz"/tmp/receiver_hwts_logger_eth0.logeth0iT)frozencBeZdZUded<ded<ded<ded<ded<d S) ModeDefinitionstrnameztuple[str, ...]hostsmaster ptp_ifacermode_dirN)__name__ __module__ __qualname____annotations__R/home/apu/testbed_files/experiments/parallel_wifi_ptp4l/run_parallel_wifi_ptp4l.pyr r !s@ IIIKKKNNNNNNNNrr infra)apu00apu01apu02rwlan0)r r r rradhoc)apu10apu11apu12radhoc0mesh)apu20apu21apu22r#mesh0rrr!returnargparse.Namespacecztjd}|dtd|ddd |d ttd |d t dd |dt d |S)NzBRun parallel Wi-Fi PTP4L experiments across infra, adhoc and mesh.) descriptiondurationzExperiment duration in seconds.)typehelpz --experimentszinfra,adhoc,meshzFComma-separated subset of experiments to run: infra,adhoc,mesh or all.)defaultr-z--broadcast-ratez8Reference broadcaster packet rate in packets per second.)r,r.r-z--startup-delay?z(Delay in seconds between startup stages.z --ptp-binaryz&Remote ptp4l binary path on the nodes.)argparseArgumentParser add_argumentintDEFAULT_BROADCAST_RATEfloat PTP4L_BINARY parse_args)parsers rr7r7Cs  $XF  3TUUU " U   & G     7    5     r raw_valuer list[ModeDefinition]c|}|dkr ddDSg}|dD]`}|}|s+|tvrt d|d||vr||a|st dd|DS) Nallc(g|]}t|SrMODE_DEFINITIONS.0r s r z(parse_selected_modes..dsNNN4 &NNNrr&,zUnknown experiment 'z'.zNo experiments selected.c(g|]}t|Srr>r@s rrBz(parse_selected_modes..ss : : :t T " : : :r)striplowersplitr? ValueErrorappend)r9 mode_namesitemr s rparse_selected_modesrLas!!''))IENN3MNNNNJ$$$$zz||!!##   ' ' ' g     rc^tj|ddtjtjdS)NT)shellrOrTrUrVrW)rNs rrun_local_shellr^s1 >     rpathrcJtj|}g}|D]R\}}|d|d|D]\}}||d| Sd|S)N[]  )jsonloads read_textitemsrIjoin)r_datalinessectionoptionskeyvalues rload_json_as_ptp_confrps :dnn&& ' 'DE JJLL++ ^^^^$$$!--// + +JC LLC))%)) * * * * + 99U  r remote_name local_pathNonec t|dtt|}tjd|dtd|dg|dddS)Nzsudo mkdir -p rSz sudo tee /z >/dev/nullT)inputrVrO)r[REMOTE_PTP_CONFIG_PATHrprXrY)rMrqrrcontents rwrite_remote_configryst D;#9;;<<<#J//GN S"8SS;SSST  rifacect|d|}tjd|j}|st d|d|dd|dS)Nz ethtool -T zPTP Hardware Clock:\s*(\d+)raz(] Could not determine PHC for interface .z/dev/ptp)r[researchrT RuntimeErrorgroup)rMrzresultmatchs rdetect_phc_devicersq T000 1 1F I4fm D DE WUtUUUUUUVVV &ekk!nn & &&rc4dD]}t||ddS)N)zpkill -f ptp4l || truezpkill -f phc2sys || truez*sudo pkill -f receiver_hwts_logger || truez sync || trueFrO)r[)rMrNs rstop_remote_processesrs7,, gU+++++ ,,rc jt|dtdtdtdtddS)Nz sudo rm -f rcFr)r[GRANDMASTER_LOG SLAVE_LOG PHC2SYS_LOG RECEIVER_LOG)rMs rclear_remote_logsrsL  PoPP PPKPP,PPr str | Nonec`t|dd}|j}|pdS)Nz3sh -lc "ls -td /tmp/tslog_* 2>/dev/null | head -n1"Fr)r[rTrE)rMrros rlatest_tslog_dirrs5 TPX] ^ ^ ^F M   ! !E =Dr phc_devicecRd|dtdtd}t||dS)Nz phc2sys -s z -c z -O 0 -m --step_threshold=1 >  2>&1 &) SARB_IFACErr[)rMrrNs r start_phc2sysrsN "j " "j " "  " " "  D'r startup_delayr5cPt|}dtdtdtd}t ||t dD]N}t j|t |dd}t|}|jd kr |r ||kr|cSOt|S) Nsudo taskset -c 1 chrt -f 90 rc > r z)pgrep -fa receiver_hwts_logger >/dev/nullFrr) r RECEIVER_PATHrrr[rangetimesleep returncode)rMrprevious_tslogrN_status current_tslogs rstart_receiverrs%d++N #  # #  # #  # # #  D' 2YY!! =!!!JRWXXX(..   ! !m ! 8W8W D ! !!r ptp_binaryr c |rtnt}|rtnt}|d|d|dtd|d|d }t ||dS)Nz -i z -p z -m -H -f rurr)GRANDMASTER_CONF SLAVE_CONFrrrwr[)rMrzrrr conf_namelog_namerNs r start_ptp4lrs$*:  I"(7iH  G G5 G Gj G G$ G G'0 G G5= G G G  D'rrr/r list[str]retriesr3delayct|D]2}td|DrdStj|3dS)Nc3LK|]}t|ddjdkV dS)zpgrep -fa ptp4l >/dev/nullFrrN)r[r)rArMs r zwait_for_ptp..s<jj\`wt9GGGRVWWjjjjjjrTF)rr<rr)r rrrs r wait_for_ptprsV 7^^ jjdijjj j j 44 5 5rc6tjgdddS)N)sudopkillz-f broadcasterFr)rXrYrrrstop_local_broadcasterrs$N999GGGGGGrrate_ppsctdtdtd|d}t|}|jS)Nrrcz > /dev/null 2>&1 & echo $!)rBROADCASTER_PATHrr^rTrE)rrNrs rstart_local_broadcasterrse %(8 % %: % % % % % W % %F =    r remote_pathct|d|d|dd}|jr0||jdddSdS)Nzsh -lc "[ -f \"z\" ] && cat \"z\""Fr)r[rT write_textreplace)rMrrrrs rcollect_remote_text_logrsn T\k\\;\\\di j j jF }Afm33FB??@@@@@AAr remote_dir local_dircf|sdStjdd|d|t|gddS)Nscpz-rq:Fr)rXrYr )rMrrs rcollect_tslog_dirrsH NE5T"8"8J"8"8#i..IQVWWWWWWrmode run_stampr+c8|jdz |d|jd|dz S)Nlogsr_ptp4l_s)rr )rrr+s rbuild_mode_log_dirrs/ =6 !y$P$P49$P$PX$P$P$P PPrpayloaddictc`|dz tj|dddS)Nz metadata.jsonT)indent sort_keys)rredumps)rrs rwrite_metadatar s3 ,,TZUY-Z-Z-Z[[[[[rct|ddD]X}tjd|ddtjt jdYtddS)Nrz Time left: 4dz sr}z Time left: 0 s)rsysrTwriteflushrrprint)r+ remainings r countdownrsz8Q++  99999:::  1       rc t} t|j}n*#t$r}t d|Yd}~dSd}~wwxYwt jd}td|D}i i |D]}|j dz dz }|j dz dz }|j D]}t|t|t|t|t|t |t#||j} | |<t'|| t)j|jt/||j|<t1|j} t)j|j|D]}t5|j|j |j|jd t)j|j|j D]K}||jkrt5||j ||jd t)j|jLt;||j st d  |D]}t|t=d t?vr|ngD]C}tA|||j!} | "dd|j D]}| |z } | "ddtG|tH| dz tG|tJ| dz tG|tL| dz tG|tN| dz tQ|)|| tU| tV|j|j!|j|j, fd|j D|j|d|Dfd|j Dd EdSt d| t[|j! |D]}t|t=d t?vr|ngD]C}tA|||j!} | "dd|j D]}| |z } | "ddtG|tH| dz tG|tJ| dz tG|tL| dz tG|tN| dz tQ|)|| tU| tV|j|j!|j|j, fd|j D|j|d|Dfd|j Dd EdS#|D]}t|t=d t?vr|ngD]C}tA|||j!} | "dd|j D]}| |z } | "ddtG|tH| dz tG|tJ| dz tG|tL| dz tG|tN| dz tQ|)|| tU| tV|j|j!|j|j, fd|j D|j|d|Dfd|j Dd EwxYw)NzERROR: r}z%Y-%m-%d_%H-%M-%Sc&h|]}|jD]}|Sr)r )rArrMs r zmain.. s'RRRDtzRRt4RRRRr ptp_configzptp4l_grandmaster.jsonzptp4l_slave.jsonT)r F)rz'ERROR: Not all ptp4l processes came up.selected_modes)parentsexist_okzptp4l_grandmaster.logzptp4l_slave.logzphc2sys_eth0_sync.logzreceiver_hwts_logger_eth0.logc>i|]}||dS)rget)rArM phc_devicess r zmain..is)#[#[#[D+//$*C*C#[#[#[rcg|] }|j Sr)r )rArKs rrBzmain..ls,R,R,R4TY,R,R,Rrc<i|]}||Srr)rArM tslog_dirss rrzmain..ms'"U"U"U$4)=)="U"U"Ur) broadcast_ifacebroadcast_rate_ppsduration_secondsr rrrrselected_experimentsrrzBroadcaster PID: r).r7rL experimentsrHrdtdatetimenowstrftimesortedrr rrryrrrrrrrrrrbroadcast_raterr rrrlocalsrr+mkdirrrrrrrrrrr r)argsrexcr unique_hostsr master_cfg slave_cfgrMrbroadcaster_pidrhost_dirrrs @@rmainrs <??  oooqqqqq !!**+>??IRRNRRRSSL"$K(*JK" L LD58PPJ 47III L L%d+++!$'''#D*:JGGG#D*i@@@.tT^DD $. D!dJ/// 4-...#1$8J#K#K 4   L2$2EFF 4%&&&" / /D  DK(      Jt) * * *  / /4;&&D$.+d2CT_]bcccc 4-....  / L0BCCC  ; < < < ! ( (D !$ ' ' ' '   &6&((&B&BNN  D*4DMJJI OOD4O 8 8 8  H H$t+td;;;'oxJa?abbb'iDU9UVVV'k8F];]^^^'lHGf,R,R,R"U"U"U"U$*"U"U"U         3/33444$-     ( (D !$ ' ' ' '   &6&((&B&BNN  D*4DMJJI OOD4O 8 8 8  H H$t+td;;;'oxJa?abbb'iDU9UVVV'k8F];]^^^'lHGf,R,R,R"U"U"U"U$*"U"U"U         ! ( (D !$ ' ' ' '   &6&((&B&BNN  D*4DMJJI OOD4O 8 8 8  H H$t+td;;;'oxJa?abbb'iDU9UVVV'k8F];]^^^'lHGf,R,R,R"U"U"U"U$*"U"U"U       s(' AA  A GV&VE=[?__main__)r'r()r9r r'r:)T)rMr rNr rOrPr'rQ)rNr r'rQ)r_rr'r )rMr rqr rrrr'rs)rMr rzr r'r )rMr r'rs)rMr r'r)rMr rr r'rs)rMr rr5r'r) rMr rzr rr rr r rPr'rs)rr/)r rrr3rr5r'rP)r'rs)rr3r'r )rMr rr rrrr'rs)rMr rrrrr'rs)rr rr r+r3r'r)rrrrr'rs)r+r3r'rs)r'r3)8 __future__rr0rrrer~rXrr dataclassesrpathlibr__file__resolveparentROOT_DIRrwr6rrrrrrrrrr4r r?r7rLr[r^rpryrrrrrrrrrrrrrrrrr SystemExitrrrrs#"""""  !!!!!! 4>> ! ! # # *(- 8 X+  . " * 3   $^ )G# ^ )G#  N )F"    2<;;;;*'''',,,, """"$HHHH!!!!AAAA XXXX QQQQ\\\\!!!!YYYYx z *TTVV  r