From 51a5036f0ee4a069bdf084552ac6fc6dfad0bb9c Mon Sep 17 00:00:00 2001 From: HappyZ Date: Sun, 26 Feb 2017 15:04:03 -0800 Subject: [PATCH] bug fix for splice, add normal udp + onecopy seems cannot combine bypassl3 with one copy.. need more digging --- .../client_send_normaltcp_splice | Bin 51716 -> 51716 bytes .../client_send_normaltcp_splice/main.c | 2 +- .../client_send_normaltcp_splice/main.o | Bin 5064 -> 5056 bytes .../client_send_normaludp_sendfile/Makefile | 18 ++ .../client_send_normaludp_sendfile | Bin 0 -> 51764 bytes .../client_send_normaludp_sendfile_pc | Bin 0 -> 13877 bytes .../client_send_normaludp_sendfile/main.c | 250 +++++++++++++++ .../client_send_normaludp_sendfile/main.o | Bin 0 -> 5000 bytes .../Makefile | 18 ++ .../client_send_bypassl3_sendfile | Bin 0 -> 51832 bytes .../client_send_bypassl3_sendfile_pc | Bin 0 -> 13985 bytes .../client_send_bypassl3_sendfile_DNW/main.c | 288 ++++++++++++++++++ .../client_send_bypassl3_sendfile_DNW/main.o | Bin 0 -> 5000 bytes offloading_binaries/old/test_splice/a.out | Bin 0 -> 13464 bytes .../old/test_splice/test_splice.c | 113 +++++++ 15 files changed, 688 insertions(+), 1 deletion(-) create mode 100644 offloading_binaries/client_send_normaludp_sendfile/Makefile create mode 100755 offloading_binaries/client_send_normaludp_sendfile/client_send_normaludp_sendfile create mode 100755 offloading_binaries/client_send_normaludp_sendfile/client_send_normaludp_sendfile_pc create mode 100644 offloading_binaries/client_send_normaludp_sendfile/main.c create mode 100644 offloading_binaries/client_send_normaludp_sendfile/main.o create mode 100644 offloading_binaries/old/client_send_bypassl3_sendfile_DNW/Makefile create mode 100755 offloading_binaries/old/client_send_bypassl3_sendfile_DNW/client_send_bypassl3_sendfile create mode 100755 offloading_binaries/old/client_send_bypassl3_sendfile_DNW/client_send_bypassl3_sendfile_pc create mode 100644 offloading_binaries/old/client_send_bypassl3_sendfile_DNW/main.c create mode 100644 offloading_binaries/old/client_send_bypassl3_sendfile_DNW/main.o create mode 100755 offloading_binaries/old/test_splice/a.out create mode 100644 offloading_binaries/old/test_splice/test_splice.c diff --git a/offloading_binaries/client_send_normaltcp_splice/client_send_normaltcp_splice b/offloading_binaries/client_send_normaltcp_splice/client_send_normaltcp_splice index 178692c46f3155005fa803eeb44d4a1ad394ce3f..72e6578b5c583985d63289108294d3b29fb0430a 100755 GIT binary patch delta 5620 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 delta 5597 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 diff --git a/offloading_binaries/client_send_normaltcp_splice/main.c b/offloading_binaries/client_send_normaltcp_splice/main.c index 84eb0ee..55a49c7 100644 --- a/offloading_binaries/client_send_normaltcp_splice/main.c +++ b/offloading_binaries/client_send_normaltcp_splice/main.c @@ -48,7 +48,7 @@ int main(int argc, char *argv[]) uint quota = 1000000000; // default bytes per slot, default 1GB/slot uint sentInSlot = 0, slot = 1; uint total_bytes_sent = 0; - uint bytes, bytes_sent, bytes_in_pipe; + int bytes, bytes_sent, bytes_in_pipe; // for timing double elapsedTime; struct timeval t_start, t_end, t_now; diff --git a/offloading_binaries/client_send_normaltcp_splice/main.o b/offloading_binaries/client_send_normaltcp_splice/main.o index 81cb71cb4d9bbfe4b6ba39553c1290e948dd85c4..80590c60f2dd8a4f1e472bfe964a8f200390da40 100644 GIT binary patch delta 761 zcmZ9}F=!J}7zgnG^ODq(6mv;zQk&8%jpl4Rqy*7ogiwX1m_ckohX}g43f&x9bg5HY zz6v5rB4+3$l`H7r5J91q4vG;gI3&iy#v*j6P*9BDSKs8peZTj=ckg@exV2<8xnQaK z;=nU=Z@lDsa`W}wlO;En_PaZat$tObPL)v=I-@SB3(j42Q>jfdjlsjuPn29EJzqCa zZm3|nIb@Za%QRt}?<(%kEPY$X?JraG$jGP!eK3BhVS48Ys{py4q;jasn^IS3)SC(B z;dk@tUKf~bb_44)>$UsFfbW0W?QNvX4Orx6GqT;kra5};?N>Ir-c+!_iwplPrh>09 z^1j_(m#((e%L{MSZT=$3md+Mu8OQmVfs2iY&KqA!sd4(*u|2Ze0R)ra!`wf;>IJHt zb7O~a)dyVWTP}+Y@SWiKqGNV`JfJF0%Wo((<@^XdHfHiX5x03#JFUGZ4gh7b52%T} z*_NLFt&MPVS$|68_j4k@|3EwjtcW3CLkt5uI(zuA@ovl@Ap;Z0icvm@&eLKHm=k+| zCGj}0CUWD?A~)XCMhGT6bJC{b9OXct=-ve)pf)Xp;_HMtZWex#aad%?WqoR5Hj%4(L;wI!Twyj zsl0+H!Hqn0@DOZSL4-mFi4GM-9X#x0LzV>{g{1AhaRLWsKEL;Szu)&a!z{Tg?zBVe zGrdpaD9!ni;#6(x;GEx)kNTT4-+O44o2ftxe1y)@x$14YLR90p(YJT$z?^U7r)mZ& z9>pqa15Rb_5uY?pwT%UxTi+hy#+MPkZxkrUAB{h>pWj6ilw?2R(i3hovvi&hnS~_s z6|W@cmGWIaaAqw9qM$J9wCv%^vD!&&&n^WeF(n46qw7 z4Zg3}(;25LNH+4J%)84)6a$}b01pjK<7~E!;Du<&*S!i|34J4` zbNn)%POXMhwb1oI_Tny^Ry+OVZmW;RdB}3f;Tfx)uUfHSr1f)|oo3H+8x~vmXf(x6 lB1Vfmm~c(61-QUN(FBjn+%R8DxE;yezz79DF?jqR{sT^uuG9bk diff --git a/offloading_binaries/client_send_normaludp_sendfile/Makefile b/offloading_binaries/client_send_normaludp_sendfile/Makefile new file mode 100644 index 0000000..accb944 --- /dev/null +++ b/offloading_binaries/client_send_normaludp_sendfile/Makefile @@ -0,0 +1,18 @@ +#CC = /media/Lucifer/android/lib/android-18-toolchain/bin/arm-linux-androideabi-gcc +CC1 = arm-linux-androideabi-gcc +CC2 = gcc +CFLAGS = -pie -fPIE +TARGET1 = client_send_normaludp_sendfile +TARGET2 = client_send_normaludp_sendfile_pc + +all: $(TARGET1) $(TARGET2) + +$(TARGET1): main.c + $(CC1) main.c -Wall $(CFLAGS) -o $@ + +$(TARGET2): main.c + $(CC2) main.c -Wall $(CFLAGS) -o $@ + +clean: + -rm -f $(TARGET1) + -rm -f $(TARGET2) diff --git a/offloading_binaries/client_send_normaludp_sendfile/client_send_normaludp_sendfile b/offloading_binaries/client_send_normaludp_sendfile/client_send_normaludp_sendfile new file mode 100755 index 0000000000000000000000000000000000000000..1d6f1f21339d224844e77ce2041f2ee046bf10a7 GIT binary patch literal 51764 zcmeFa4SZD9nLmE+y^~i$n2;cdfD;H1kR+23B2v`wY9Ik7FCZ#)5|YV_gd`?|M8y&a zAX-pBe5nm)sJ5k6ZM1glw%EpMEvs~wwsx0oX*)0ECq=rYEB!6CYX0BvIrq-o1njo| z-R=LspHBzQJm+~i&w0*sp7V0gy>qj5N!e0O(}eXgM7AJyDnW=sz|(I?PF$gIiA3-w zi%by@5_wjV1yINV8k0dDa4V$)XCjZfne3m_vr!LH9EncFFS$X8l9ejGf&xd8STFfH zKqL5#;4_^E&O|=zC?D|G0bKHtS6e_VfZz}aQ85L&MDS) zFuZmce#bC;^Dw+?7`}TL{_rsTv0-?R4NpVNmGH`F*0^es4`(UAw4lZE5kGmDD}cbLEq$dv=Y`eGs8Z0Dffzr zfMby|kW!F1S6Jg?0`g9zaY&Pp_~BSdk~tx+GU0H*?&5sH@r?lK>og%c?+hWFbdC^qpC?4eT_A+h zE)t?+KO{uQIf6L@j$rRVYVhG;;`#3kh-Gl*n-7N_Z|w<-KO7yf@)s}0^5<>&Gq!xt zmOp9BpRnbR+4B9i{42J6pDlmHmJitSPuTMNZ28@`e3vcXY0J0S@{P89wJpEamiO55 zCANIAEkBoe;fW*`=lnXc>(xZ}U|tCD%)0*G0a23k>$R@l0Y~57u=B) zQwD5uiV*|C9f%~Ney95?X1kdTZ3bt+!QpW9G6i!ldPqI8h zTgqte?l5%?mlu%z&ETNaX^22bpbd_`L#HRfU+3Yc4A^r9_MC@37tsFQH^Fbk4+nQ# z+dD80`nmuo0J1I@AZ^Ps@od1c*9RhQ6E8Gj5bz9q#`;#kZ*!shJlbKv77WR^F39#i zGLSu8`ALVI0pBfwEJk=_DInz?kjD`F8Rea5pKw0{9f8mS%DDrf1Q%$K(cOU;4R_%1 z>-o^*354E>hwaX*2EMBaDHmtz|F(&nfk{t)x`pd{3w$Uux$2*iS*r#^8@3PtLc3m}az%YXJ4}I>i`DB&pbG9AR zTJmuIsgDQWD}>M1&EdFuI7lA|XCU&gpw9w*7W8SNBQgu|J>MpyL1v~a5Sb-u2j4w{ zI{yh}G{nIhfWzydPSWiSn)UEIivcJJx?&$rHiIdcZ1kJk$SMfZvOGrx5Xyjdtj+TEq;;cSQ(G z^UNsSP5Ov|sgPxCO@J?5kkde?EPRoVahn-*DVt`2-w55DFXlpyHepGAtDbhiH=_TM z0f)3t^=+bMEBbIQ^rt{(5oGH`AhHe++kmsw;{uQKC+9EX*(T2Ui#*HrpAHVrtFyIp zA$5UYg)+LdIS_h;8Z1Fze8=6J3~d5^7pw@toE=97h{%Wvn_+K`x1N0{sF%VQZ2+yqxzF$~|wZ&(ilt&Kc0f`bH{$%lSSFws214 zoNx6j`)=#t;Da*$-Fq=N2OMG{th&0JI1S9mQj6L zY%6~PGSvB7K#tYl0BY#l?*Oi|_0vh>@Rz-xX0YwW=qFDgv=%&jA56ZCU)YC7u@Cr- zjpu+b;?R!uHh-~y81vm+Yrv1U$y>f;-~8N0Kkxcss2RGgc`@60)c|E4fZc50Hv!qc zZvfI?)SGdlG<+U=jk=|{7MPAb;#*ICY7b!X!cig%7s}(1g4k1>#Ng^jdM8VWxkz0* zau=M$#bE&HLME>JUFBh{_1Y96=4rwc!dCQ2U8IGu6-`dNu{Gq(YYpkHML`Yqri~7S z(hCqz@C9WxQS35Y+cOU%e;E0vk?nS)5=*J{TNKHn5-j5!Rac;#bcc5Qu;0 zf*{N4X_;8-#aTUnO4tpVZN-65H~KbC6oz!+)@{CiZ5NgPLSl7}cMiJ)HB9rcF$DSk-rVTekPAgsg8Hk7vfgYzXfeQFYDCe%Q*+m z(*aR_-eG57s9N-en)_j6@s9A0nSgQak=2-Yb!}ZF(BB7>`@)X#hl6p>Z6UPj%%1+f z5NK%c;h+|e_QB5g(MLk$M=+m5K435wT<>1ooFMS7jJ;=d&rU17TcZ{Vbz@dpHIC zmX;C-zZfD=)>4wqt8R^b6j>MTk(LPOGZqD473lisIj~u^0_C$)mtDP__$}@>I*?` zd>8zwIpP1bZBrOq#ZI zU&vTxf5|vy^wN`K(5Qx z7y4dWAXEc?=&6CwVBzS|gO1thsp*-cp&wVN1rg#_U8yUuXJJgGy%y<4dCj$tV^Z3| z`WcUQnqHoUxJ3M!@ow3g`F3Au9mgi-h38&_&s^I_M`0${)%9WL>*yo)oq;|@Oz0SE z*fXAOLz@Tt1CfN|dm@?3Cj_V5I>DJD3e!@=oU~RUMsQ3T)tSLP<6jHynfH1~TO)m# z2LGe4yCXOPNZ$9ohcJc%k^SK>2KCJN@V>|wgQ6OE<(Dvy=SQ^QL+OKvX+334#3*}% zV`%0>!M;$O=NrNJ>MsR%joBXh;`nW$opFKC3&~xfhXw+nkNT^^2`THku@*h3Yqv)N z!PvNIL%-=Y@nOxm3v){s`Z_cC9AZ1g+9!gTClTLk5!Xe+&-nO>o~Hd6 z{F8$53?5=q#y<9_D)v2fVdot9it!)U71A?R|2#cvUob!83&HN-Q=z9v^=q_2jtRx{ z;CRd%Ld=OUrt}&kyd808xSz({ksiUAQ!?&uIlrSXLsM=|39>&CPs!V=_l3Hv52OuX zexcuJ1IG>9LmtN>$0TLo`(&0!%#GLT_l3BRhaNd5jrs$WP2)Jjyb;y4HDgg5-F>0;F7T_@1P#ykgBGsEW6b>kDF}M-r$N1XsVmhJ z$V?GknU>6O-gAF~H%t2y<-m&%J{rROnjBXV2u-_vXDEI>)3cuP5}k9!d>oUhz=q zx#EMLI3DIfZ+viPXfB|NjlvN6Rl^)6`*-sl$ z#^P}fv*HWq3gfpG?+bMTc6$zlY60&BU-Snf82@KA%sJdI5IXvE2DV|nJdSz0TfsD} zsmYELd&ArM5wHDn&c=N1mVV$Ii8(OB^}-P4<+|`_ua633zCJ3LuZb>>i;$%cg5$L} z_epzA-JvtE#dz~T=>NcWhfrrN0`;;TDK5kt@@y-wSFnXUt6`4BITEh5xF2d;q`}XL zI48UanzesQJb&mkX;`;On~naOV$uFh(H;S<+oFXpL;JMS0sW zXF$(P>Lb94qUiy{So_4wpKP95>fBOK}>Iw1!e;qpK_%Aef^I%)I)ed$IVJc0JFGZS?=;Rj8m zN9YIi2j-UaNQvm;yq#RgYi8)lmDkP(amI)>4KgRhj&Qz7OEhU?Qg?*iCd~<&6MM#q zpgD_QJyT|&UroD(cx0@Bb&Y*Se-birJwgnGG-*d5RO~!BaFFe)_8?Y7@fhbZ7=*02$i6p?~wjq z6G^TPq$gFw|LAjP^{(_{_n|SEFUFT(EM%bXM!?=lxq(PB%B7(_PPB)1IzUf$sdl&u z4h?YZmEnv4=idX4eS2klDxVZQA<<*qb8uh7n}%u@BhCMus!S4&@cB3OsVTYVVsiuEDej{ZxgU)Df29=0Qv zrS0^SA2iy0H*G~ck8^bm%*VM%inD8=7-x$HWP}T6b(m8aQz_N^;CqglH4)2xwgozq zHOSo!eYkaX)(IKL6V{!G!?cI71ivLSwlLnJHdIQxRDAKQm+@5%Uw#gLPjRuX3i@>X z3$S6nYd`FQ?@-t6!0FdS+Cw`rj)7|$>P!dS!Fl+15AVZ#dKQEDEPQkpYwuaiL1!^R zoE;_gRz8CHA)RvwZPK-_pl}@;a5$-RJLX)qK2Rs?VtWX$<~T>YQrvrSt&BcLd_hkL ziz;FP@rn7tfpzo$jST|*D(!G0R?rWB(uV#($Z6W(a7`KD8gJS1E7)S$G2eY)z=3P& z^9yo*UF_a2$As3!v3m5(Lx{a~LB`h$7^g>(?6Bv|$ZEx5~1AK__x$V_6oOARxjAz6_7VaH6s<(&5zRIw09T?C&STnjrIK#Df zU|coU4fZGY)P@`P(LkHH?}s>V{UPRboaKmH7=v$3#@X~l&~%(<54sIm)~MMP)Lntd z1lJF-Mm&nxUK^QP{b-!#P7n7%XF$WeDqOIYeJ*hC3v)~HV~EqL$g}VRbvpu&#k~~x z=d==mHLCBei0J!la1?x!fVT7%|8rVm^)B5}y=!zc{3FC|@JpZ@W8*>1{YJ!q>0?Lnt}xO z$g^Jyggy(}TGvjjYaJ0Me9N`oA$En=qQ5xznlUNs>tlVzo-oh-Sl>w0my34OekaCS zoEzsPILB~_oddI6Psj0m-;#3`KRPf)`lw1?qh+H%xDP^oa!u+%+i1T)oh)-5WC=MY zKLtJTbNF$#NA}O!h`!(r-b0e@x)$~%A`aPan!6iQL}dg^d2(U^=eGSj!%nPE4smO! z0yHh~U^rRZ6?FFR#Xe>4z$BhiBSuEJWnHqJccGmr{nV${PCPdeYe(SGf#0zV^s#=c z9k_iz9&1oU1Om91xfAEKyMo#1t671a1BJi^{GKc-xu1Pj!@MY9gLhb)KZIVknd?=Y zOYS?*VlI;B;w;azI=LUJ-u03Lv5ol_`v=8mtRiN9#&d4Ol(aX)xi`F*XUJ#=#xv|= zn|S|J?X9dheiikm!q1lPe+HcQwrPv*>V21TKUKELd&OL5Fy^8@c^*8@1MGLqC%Ct} zb0E8VC&sl}H=oGHtPeXi*vs||emr;}j1^)CuLkEaDi|A8^aYdgmx7QzmkGo_)-e_$Tc zmuH0Mx^~8W33?o^*Ws^<$YJQp>O{RIflw9__n`^ZJ9y4I-ifvGa~R8`u+|z~f&CbF zk30%I4&`0o9WZ$Zv0ryoBYwKz!+np1wS9qf-WSH&n*IRvusjCygTlpq?r82yk~Qb| zA{@h%D{*$6hCj#aPMilhcMd$odj)D9{ubyF7)RWH z!dDpEuS=aL++C;lOPRHiPP6`VgM(0W3-=7kBT+Bxde2$h0Dn9x#|`=e`%dw*F2v0J zY1@K3in;zEwh*(1c3`ZbZKFR&<7{WVk-t4iU5MpmC)$?a3S>H6f!PbM-W%SYxh+_m zw=le`rW-!2#2)UE42SazWB!P8oQrTj7_PuPj2NLUY#+{5-dlk7(NBos2T8llY$L|L zw3ql?`T+haq_5CdlN(i^#k+R|ouKE^$Jj$~?@ir_@P{YA>vRpucD3!rd2}FjJN3Y4 zyK3$aI;xk3cP!`*vW*TG>~wue+DY3eyAZNhp-!i{zu*{`*9NA3C-k3yelPV`?+tS; zWm}|A;XBQVb=1g!uMm&gu4p{+nFL&yk4G%Z^>;bSpxtM6j2$=!F^+w_tQUK;uD~OS z)q(wu=szdy^_g=zVo>@Haq-?>(C9Plso#45dHQiT&R<%QU&Qsc`_(gr&aUuWvH#3m zfwR<6`_72qp);8y_MPJ%D04)Ygf0_zMe!3RyQVr6bNZXM1BOOM15$QFgA0dU1eixKF zv~7JKYWtB6BfZ%7A={vB3xI}n80p1;q=_KfdNt-3^hFBV&Fj}um>-LShXzV8H?iF1 zWQzU_ndSePjC*f*;(sRN+8cgwm`tMk1jb{fyuMB{^K!o6Gdu470SDsS!Dm+R9E)&w zA&-3}+J_kybL%4PVfy8@uz~%O0FT$gY-b;0ijezVuBmdri~SDvnOHLep{cOLzTd^( z?(E=A=Cx-VbXB8F*WU2pQ)=(?4%X*BtSbWZ1nk4uUK9BdU`jE@0oJd0=oH1=y9Gk2 zsADAbTR8cnK%-1H=&!@}E~k_Cc*YByqtG7FrOJ+k+{YgdzBh=yQwr7?2iEUmkr6Qh zcQ}o}gCZrccOVnx&tw1A1;3?J$6~dI_$q94h^~;HB=@!Bxo&+0vI6(J=mW73b4a$@ zOR>(|u#R!9~g`kVgTigOaqB~C{- z&foXSc`pI`4BV@E@At5ITV6Nr9c&L$4`OD3^&JEK>!^!s7Il_GmUG=G_~*P!z!%-n ziTl8?=|j+7Mq7G$y-gnO`AM50uTS3|`6uY=2Y(K9y=iOfeCRYTqf?*O9r_;1{J1bqyGW&INy-+X`j%3+RA+r>py||ah*Hq^j1`f`XQ%U;Tk%kJo_}K-eqYeQ zibSSsbxY0qW}nO7>f&?bu1^rmg_28TsR8Db7i+-0sdd232g_acHIM-z)3p>i)nXs#zP_$=gkRIUcK=%8CkVfycbzy({76^fdx~Br;j>*w0KeA$QrEF_ zica{|8|QY_{YK%P5&naC996WPN8$Jmt58Tb~>GQrB_7zON;Az5Kr7 zzXACCje1wse++Kb(7rb=D*A*!C_VE5sb?19*04kUBpJ;#^nkS*3o5 zc>;OdGZN3?LKf%Z^0$>Z*B6U{&r0JcMVZ`u!;NxR9!WX9AKx$%HuX zZKaOC^g~_LUxKt2DG?Xt{J5v%*>t30B!1*?-wRaU{=Eea{c9v~)1pQ5T-i6RTs^~8 zm^*hUdY!AlonPplTX3x_yRF^V?!%9PJA5-}C(dYPUu#0!lA1D7;-sI0Gmi}6>ruW7 z^kX=P#@UX@Mj{>r{tV#4RQHagor${=?vLLc_kiO;bM=oPRe(tQkMG3KZP5H&47zj6L)~y_K$C*Ms<~-gBg34?sdS~?-pJM zoUvr-Y6M;fd||3{hhwL)3;M(?;4Y-&;AO*(g{fJWwqa%J`2>CYkak?ajX2iDwz2$& zz@GtJn3}O8Zl`0HaX+-LOucC6#i@210}y80Et`%4_seoIn=Jd?nM${Xdw{b&7G4FM zdMvyd_&VUM&xLdhIQwW}>bQqAPpZR`J3maWY_gDkka88N4y#R_pdUl|rRbaZopHMy z_Zz#>s^zIC9C}6SxTx=nr{L*+jNi-pZfRMe_yW;PU+wFM3co4N3{aUKa(%0<9JYeZtm+G+S&w-9%gnAOY zQ6^gdQPA1{!|5kMXPbx9gTv_iAft=h`K|pib)>+1KQtgnT3$z9OWlSXe`{-VZDS4I zYthkOo40;bQ*&KjZf;&fZ7owyVeWN!;l+BQI6JCuYRIc;--t2Rv_8LnQ%h|}ZY7mr zQr0;Q82^-@x%2pO>$w?u`G9441;!Qil9rdJ>#*Ps6wrnDzul%LpU-#goWh*C`j}BK zW05hwkH*d}qA}98f;?p+Y?|!`6@ZrFdv;!d#7V;kVg-3~$jFld;LR~LkZnxN1?HCQ z0ul<`kj58E;iELkED5t^t>D6le3k=^B2tAcVI(PiQqV{yf=@wSk;4x$SZO~ z*=+d*T_}%lR3H_AExnCj?ETfe-HavM__{+wyJ&NMKHA8P@tVj5z^70--1H9oKvyV# zA%k)SBuLlEFImW~1ehO^WxuEjs6^JpzJ&&QU1}yBAMguEBSQuPveG)z_{nFt5t`o$ zlPW=pVP+0Asg9MX|B3=OB@jne8DQ22eI<*_Zh4L2|5q9Wr?B%ezLKcHDjD$fkF*6Y zU>KUMR(2XGW>?K&h!)Z0!b`v0vJs#CD>fn#y9VQ2lBTSb{bYtZfi&lVzoI#HH0QBo z(;VeN)xV}Oo24;-m6`Vy+VXeO7U_pk*dgoUHV*v%&Po3-T`)whFpJ>6NV{)yV@H#( z(Oh9-tB$qEaD{1Vscqg==lgStVQ*UB)XCQ}wYRqV^EP#~M@x%M@?AGMSg3MqxjM!0 zoZ8ln8(Uj)Q4u_3GIARQR_;rM8o9!6YH8~5*Fgk6MF#7h%5%lz#@2Y#(8i$S^BuZz z{J!P0^KuHd&2H#!xTCSm=vHpf)w89PP;CHt~Cw+uc}J+I%Q4zj0N5na~~DlEQ0>R^-hDFK<@i%z~yoBV{@1hCdhMw2s;M z+<12$C}%(ORC-QcPM*7=EWe?wp|l|{$6*+Uw&sp?&oS=FHJrKmV^Qmz<>QRUwA|)i z_lm=^iWN|z$JfVKVEHgQQICv!3dpsT>uiH{_RjiqN1^G;P;?%g6lwaQ7=MV{&s#bMm^;%x~+<$LGVVMKA*PDF6P#xI4FOm1#~H+PTxrS9~FF z#%y<)kx~!;(zhdX-Ls62To{6h#_gV!mseI+>YnA!skkQ3%|gaUV!6@1RdvQkBG=fp zb@_(;!h#0lp5-$O3-Tc2h|kTXXl{HUG3&Jz*A&RgmdCHyl~=&ZXUv{4y8s=QUsmF- zSg~QnY@?lCH+wjKdwgj#8dG`)78nGES=dPWRz9;cR_5fCx=W(uwCz#=g*N8o<-tgI zqq}UDyL49>jn6asK9g(wOk2LfYW+&~4mH8yv{KKFFYRTd-m<)5R>7=1qhI8rm5<$5 zpI(lC#xL(%UZ4NLio9jB8(7g+Po6Ovo~kzkk^xYP?wJFoW0|Lv0hgTn1&YQmk8gw} z`K2HjY0Hf}>Prhs8yn`VT3Jf=N{pDi{AKRaFRX0r&buS8@S6O*J4#oSB1)Fz(2d&c zrl!)uJMtRynh=TgL>lw*SXNifpS3FAc=0p!9Aj55M-TIVYHpq}WqIj$j9ps2?!cZ? zEw}$8v$2{uVq4C>nV1#6u4#FQB90yW$F`80OZ87JV9{^2iHV|Ww+T^vjNIJBO!ZG6 zjYjO|j4qz%!ty^bum7c!G+uC))3K?Ix4}PYn#BYGV=+_mvdTCiv@uPMrM)Xw@&H!tBhY_IMwAE3pkeZ%TE4cRozwKVtkmJtVu%b+c6e4crhE+#P^LCWwAZ&8-R<0<^X;`(P^!_qtHrS+^ zO791$8zplZTAEbpr{Y_%m0n(ev4|mBT3T9`huF$@d$6lpQI4LGYwS1V^3K*d&@1W? zgclos=^|;ns^WE4^rGr7SUIuI<=~x!n>usYg?P%rSF^s!yl4|R<#8>jbQR|uY&oyS9UA&TTFtHP{}#*VOUplpy#}r3e)fNh z0wf z4ZjaA*XH7gif@Fa^=DFr_&qO7{(xg~#}u4X3B!@_8wxw(@TN?m-;D!($5b-nyqh)) z$MmVl>M0oMj%=P58How^WANx3DL3OzQuKsXxGSLdq8`W0Zc?5xeh`dJ*mJBl8JJW5~pdzPCjOUFSc&K7*E%XUAfJQ>8HHmt z-dcuy5xyL29zi}a=_vH#w>S_TCX!yjm%~S@LyRQpkI1I-%fYT34f94g9Zh3liIUyGEZ(z8S(+_n z4GOhZQ|RYx(49(oBlGPfJCg3BlR8LGRE_X6pCU#%?nPxI?}8AMRF}Xm&qUui_kxth zPETVF!XqF&%5fhMbm)EkfC;teIFW!~QKLgYVB{pUf?_0Ou@8mb1+HVq=TwRN@%vJd z;0H$}a2nAP;$fqn@G;aH2`d>b3I73+IHAv>@ejYP${m;ll?iX6ghj`o?H)@)J!dhlm{l!k-a24lAP@J!<+&VlTMNTH1kPl4rTS-bkG-PKvdsO z%fI{?WJfu6;CnPZa0r<+MzC~68d0z}K#@L;HNN?Rlz-WhKSg44MGQw=eiD4;NSFc#BtD8F#adP&gi_jt zHjNoGI2I!-dvlaXd>w7utzFYVu{xpUFe6ghYLL%mu%yB;KgdR!xMg zBkBL51)7IOEKa$rzD;Q5G`u7!AAO)z(4rG#zQVGVG{vKhd74NS4LE@t4M(YJHLD%5 zSgTnct*Mq8&6?_DO+sH!mA)B}F|_zaKny+Z0)oj%j2j0BjdHYsb;T$L`$jJVMW5ac zCHew5T%WNQ%;X|eKK94>a_BQ(1R;U%gB1zC!k3ot7V^3n;m{ZV7_6juEVi^BEKD0z zc@y)9*?R~|SbRjHzWn2;Y?-oI%C2A@qlXcrulxmM5HHcZXNVg|c@h$R-o z2gYJX`js41#u8R? zPyY;zt69qRf7rl7Pe7-23sdVMmU$aQ6eAOInJ(0%A7ZU5h@QZgE(iI&$W3;lgx*Vq zUnaT`@t_BYhLEPT2>mcia^;x(xg_u;iubvR$;m7!QQi*Ea^c1h+rAy-shUUMB*e72 zCJlJPW^s?0JOv#+%JCFLu4Zpc_$EqfKb5Vs?yYJ){|NR(z7rZ8R$dPw;aX11-k^)E zyRKT#7ojfm0?m4Z-Th+-s`kCX7G!`l`F6(7oAk@4flims_yM)*`io#h7c5Qu5e0fPsymh;OXf)M|{=9zK=z8U49u>Fa0X*RanY3_1ag^bl%-u34tP6L9WIcwj*V|0VW%8J(%p> zyAZm(rT(_^mF`FAWp#nT$Xss4o=tD@d8Q&o8MMj?^N5MzHCw&TE`nB5A0NUC~U&TzU z&z0@aZc$CXPS!FV22W~3bM^TeyVuzNMCYU}bgPA5yf@ng{{MxBq675sO&V9|r6^cb zgO1Wmq@p_F{ON_hOyb+=iEKPAKuFevB0Pm#aRZ6Pm$Ga$@slwExi+<*(bqZFHeEvDa{Eg2%6c;#{Prc)qH9T{N?!ZRAjBEB($Dt_7&%J+zjWW z{tf68^RH%SJSqKRJwT!Lj2dZm>yxru{~4mHTR$(m^#X9!HHXZu*}X+|-BVK2XjGq7 zFJ#F=;Mb1JR9%~n!m4}!T^dyZ zW>yxM>|PyAb}v0K3$!7F__S$hffTAhY()bRKDzEhuvaM7kfB^4vRF5r+926h^rFyA zKIp4;=4UPugfb^B^!#>@A;4znob$Yrq|uKOmm@n%#^u+6tBGowuGSDtRP~gf zE;auV{Dqrp*JFdP^V-(f-*<13jK7&Owys2MXT1ZPxl}xk$~h?S1MLE6boJj!S_No` zK5ahPm>aGWQ}7IvWR>fkvJj~gKz-LNpcYvc^JsI$v_h~r1)2)PgvmOLyj>b;J=~@B zygUZY>)>*FyZ(E)^jc)qu=GlEeZ=JyU#+u4z6>0jP@&i8>=67;6|LQjO-8NW2)4ez ztcW{%y-w#f@&fd35x45PPhSS{hk?&%#vfSG>m~j?`Tv41y+Pv47JU;s^+u_FB%;6Q zOYoxJB=LE~candH#PF-(bq09!7^lhIpvB`Ngg9n2?3O@iL*`!~RPO?4m8Fa zwcKcF$!>&(Bh=6&bi-hu-N(ks#yTW^B-*$*!)#pEap+=WI+Xr|dqhFjU1D;yMM3b{ zq63m&Dfd5eO;pH(D(0k=bZ5jXB|{UUDc6Yds;GZOIzimc}# zvK&qAR2udDi%s8VodAa__YXHB2nKC_)@0mZmY8|LWQh4C7`xh8x#U|9T53I0t}w?g zIKM|vorY)R*wx;Xn};|qv2tlTC%0$QfambJOwM_>>9PVYu`jJ+zL(YgyR6Q7j#KM7 z5UuXtWpy`ME4cQ)tgbOy-33|Q1FVjZeOlFFSHY#{(&~6pqax zJsYj=kFvVAqt$&Vt2@W)_*AJ?UBM?*_o>e(V9j}ni=6cks@5|aI~BEzpX4+*68)qW zxqsy%_c@|RF_~&V91UxOtp1;X72SZj4o`*?&*LO^9fdV{A@wcb z*Cx(T3-NLsycFSr8K-2Dd7i>!;(=F5oD+%2s?HYT4#c__(ui4O(=ia+OrqZ;?mzJv zF|!NAdm)+i3^IE-6IexfRsM!a{E{Nd<5L&tgx}|e))R1-5B<@p0&fL?^kOuqBQ7`751ECRCVGhF^T+{1@&`T^MGa^cM!)pX(Sm3 zACS=bI0^iM93yxs8X&ZdFObYHkm>KG$O*0W`y}%VWV&Ig0gLq8 zPLa$nka;qD6HmP3XP0b*)m)*thReh5v^(OEh zs8{p!SKSxX8(NT8_XYKhUqoKr7u4^13wiUtpuXZtAhG*``pPBHJ0e40%fj-Ontm%u z>b{_U8}sVEpuUcIbze~bH1q1dpnf~^yf3J)$IlbweL=mBGBS$SQ>K>enEb_fW$lW`)UCbYB8q7pS~}s@0hPj-2Zu&__OZ| z>JPW5atB^xxi?YKW$p{=kADf=5h?nUyxT1A3+jiI2iP{fmt=KcP(OS-RH*xc`qRww zz941geL?+;{5{GjM=FYqb_~4-m(FW`{ZuAojoYCxLtcKJ;vW>u;H9vBYBpG7cp0q! zQr3RO4^cw%uojM~YCx^$AmqpL(oFL(`}bHQ#;wQoIi=nQg4#!be&sBDy@FENveY?X z_f>w z3$0(^Xg%2&=q|Y#E!WtTYoI@qKgf9!h^Yem8&0YE$){lpdAq^WdcJ{Keu^yG$dY9! zsT$VEhJ6$0xK^yichDC<1(vmu25g|0uHs_Y?rXrDDt*6y-LyWCe+Of-{FHi&QcEB; z{pDQMy5rzQTX?O;BZ4JiX9V z@u;L#Vuh!U8=ymGqYC_JNEu{rMTfpNME1tZ${sQ6`l+q1lc05@{QIgrLqWv@FPEo} zGac$e_gM~g_{EKAR8-1p%XBw{Y07LVj7E#;ou*4~k|gQY>CQaW;@fPrI+NCFqwOr)fQJM^)8HRg0sl>ZK|l zaAkUfG`*9m-?&8e^pQ~g>O5Fy{k~1>`8cY&Q>y+Fiq7EA+`cRwxrRl)%OciK-?Sda zxoX&FWRV}R$Qi3h4$oTk7dRU;EYdje)3^$xErFIa&hBY!oyg&lrT#1h*=c`5ke7Y> zOBAG0mlG7Z+&O9!gq9|p@oCy<%}Bf|acW{Z;`{$Ynl?2xeT0#ERVplscaB9Xt`J7* zyb+%ou?&}GMwS>c;s)@s^q5&RFAgG!mPouq8!>{22Kj_+6rO+%Nle#_)EGT!WK`)~ z_&zxu=zIk4h;&W$+K>rm$vBpz z6N|?^zEB!B(JT|UEM13VC!rLpAc`x;tEWlRUG|EH6wi#+&*GEK;&1@bDKQ&}W<9W7 z)6%qj>9DB}ZpXtW<*&*V2aUx$DjXPb)pzi!alTu*Q1o~`Sn}HU_d^<$p98=7+xX5gn ziC#Mbo){g^rp;BB;nY-RNSmkFIM>b9ZoD$q>qBaoALU)zuh-j}ONBQ?Wf46?wA^U3 z6U`}(7Q{h|t^dGUXzK%@i`awt>9PkGo2^5~-*_bl%@TWk%hKn|U|VV@D$-54BGx_@ zEKxEH)Iw;Y?aPK1`^2fpoF>@1|Fx5ZniQ_Xj9AoR?;GnFOci$FAzeEbWy}eI zLttF26wxa$83UL=)EL0zp~k=jQYK)onyA8pV`q|W_JiVrq4`0xkj$7D`@@qW54{vO|o&tEdU!iC%XD1HYPamDAa z9NJV?N+^B~s!+sJ7$mbGZG9B~-6)^WzOS>GfQo+@HLCJFpQ*Zpe;b&J&&Q+Dgy=_= zNBEh1>nUkVK=DtwEIyB9j$C5j1DO`zI`pv06XLi~Xu?B)u0Tb2LZBBJ`5|RK5(EhP zWcFr)qe!15TW-l3qEqX&OP60pbA=_Xi8XfFil}TG>e_;2h_PqfJ$_+zl=HpNO&K*RSX(Hke?EKQAU_vkRe0WI{s|l#aV!WamkzXO%x`%b~@*X6DEizk0 zuocN6+WNNiGS?+ByK_j{gM^X<2QLxW0Sf-sDg-JCC=?G%+Qj5&Lx?C97CjOnSM9v&KF1U8$pjC9MO4A7{9G)tEzZnoGgauEroU8p5X zn!Cp0R)e!oay|`k)+#@hQu>9@FoU~Am~I=Ze#9##UR)nWmxKBCClw4%X?!b z%k3p&&fNoD0i~MYX_+l2cm`=`uaR;}3U~<4M+KO>pcn)fqYUOgR15;l5|>eVS_+gC zSSrhVnWMNSaOk2wtUf4ZD+nyv3Y%<&UG{{Ott7ByE2S*0!qi1zSrm&8Qm&E}dkC_T zhI)YlPAO1MpkyoTvN7+nbe)v-5crXlGUhrJgMcq9Qw-+16oX(#lwq}uDyyYHIf13J zyq7tO+dM|uDoLs&uw*NxENg-n2&`ISULfVmQouvdhcwg+6gVga$_bS0I=gJl3zY4V zvK0i+AmJ|$Nyq|*xKG4eC9&;jwwlUXk0W6`5Om^f$TpqExaBeK+Dpq;kb4Tr5L=pi znK`YHb-m1B4JD_nml;;UcE;wDYEbHsU;}}&Av#H(fC9z+bc`FF(ka}d$`aJ!8U;Ha zf<`3n13a_GM<*sqI}<5VPSB6rHJF$Pj>&8}fzq+s(m`8eex`;Uvc3v}CuFgk2?8?f zA;^|i+)Qwd%z6lv-ka@uV?LnXKB>2opkHQhA>h;Dh#>-{;TF4wSU9oyi)Gu^5R@Pp z;x0$;DP)3@UiBP~Yx{U)E7rUWGhacHB1fY(NBx?G64|oUt<=`0vR2Q#fEG(q6#*r5 zahHUCMYbgQlRf36Dte|53Ht{EdL2{q*53K>jYqmEIuvyc#W_B!lp1$4w=&ovhzge=8mNCCHs zm~2`WjW~*%pE4AyLP8}Li9J&-NzqL^9}ty~)d&y4Ny&}&MKl!C0A% z8nYYd9>pbiSZ1Tu&_S)Tr#%F1NJD45m_WH*AU6DB0u^?F*f^rj&8iB5&P%F@36$Ff zVpYThD(nKWDyVa-s)C^Fk}6^X<#vHs6)}MdyFjc8>O8KhAh;;As|mVNr0WU#aCVK^ zi-1qOp+g9=aQ+P{!D5;95bRM@f_;ig(4(jXFDohmfBOs#Rxr_)qtbwK0ve&FMCP_g zbIJ*5hhi}IuC%C}fTk!0b9`D3(=P$7Q4Hn|Dh2@!QjC~s<(6rRVYluLXd`ZtIs7RT5YhR7wjT zm(^AhJcq=RmA%Y;Q!xlEdn%}q zR22lLkqpu9=w*hc;;*z>UZtoaMMt((n$s|gpFlE1$JSnE-a*pDI)b1@XGYc0@tNp! zXmv%LXcxs(d)Xa{Xm=c*J_E`uU4R`3TN9Mcj9&3rWfM>qe`RI7EX`g_Kxs*^x-^l! zA}N-d7{zL$Ks`=bR}}$o1ksB8tX^haibLQ=;u(O;k4tYNg-G!b?GO`snV)MHu+-xQ zk*TC23t5&+Mu~!~cKpiG5!D0QR*O~*nK~qR)zQmLGZMPF4S@IPCEe0L4g_Unxuri* zbl~aVJ8f2if*MIFhB)=R#AY$NxHM~W@f8^a*JNwriuB?Mv$OVZnVdXJo6t)sR{WdA#!p}|vRL2c*hePxk~QuV*eGpT zv=$=ONbCi|HYCOrfFDVYU}o-D^x?%YC$N+f#as~+jm{M;!i^i&9|B$-aBlPTGPh1K z2&$130~z@#!8e8C5T+%uo~j1vUL+_a*o`!_94Vhw0t9<55g_FmB|vao9@?!Y_!pV= z5ERPOuhj&6RtmKdxa0xQYJzNa7DRACQ3*0|wgFkFm7iEu<*Z6^qf^$)AiaZx0v7?C zs&<08GFwH!^GgU+0jyKmI)FBnB{+x_o#Tk~C?3JfNQu~?-Z&ml-OD3NbhR`Pz;?Jg zK~V`@GFwHUd>|XXRtXT)DFFh%qVn`{pUNHqcv)o$UXj@$_rVX8-?NA~FyJfbD;2_f2n6%ZlDNeTT2$(NRSr5T0GFwG( z9O)BGe+R6fl=KjsLmKW9M2!4cF~%{>AloOqe+?r+#anbzWtTM~>7t;Qkey{auD!@$ zk)-J8<+=JSsqa<-#$z(pwt_77j3YXYupXC+e1a;Zp<|K)e3S=UJAzV~^$=LHvF+~! zP~}tmTX3%kxDJ$RC1CnV3T;p%f-axa z8_-T9xwi{&k%rbl%EL;4VBaMI@4&-Bq|-=e zkj^7rK(an12m~u?&m%t$8nTeA&xg1)cHsIj5s8<`6OecDa@{uy{>NORW zi@j@>de(}Ln!9{;UjAHkNl8_HQM4Q+P<_Lq=9-R<%h!zJVttdpt;X;7wYNZ~4Sz|` z+tJum?^iWccvqDQ{EfLy?JeG#I=mDXnri(Uy&aosYkj^tUmf1J+R@a|;;VD#_C!^5f>zE?r^OKqplC{P;t9=mb3e z*&*<>>?U8EXln7|Pv158L?bF~_Q9pH+tdT_-UgrF+tx1IEbwa&Z*A+Q7QeSZY;J9@ z>+m-F;GlLN-f7FflPCW&9^S6#yUU9of|xzCdfCb+jHFwQchI+jx3$e%Kg=v^2+2SaKE$i4 zYms-+stVSGdKbw7wpgskAHP6fqq9VFYfFPmehrDy*82Jm!~_2BVJ&U0^e$ahv1o}` z*(%x^p&(yI5c&oEyQ%rou->%M=WT7r*y5i-+$=*&)U3yQHKDJ9R;@%sS4VZqzv-xA zX7k34opq{r%~9^Ht*LErzqZ|=ycYpQAX)%vf;+~&$@u>P+qaOJG(Kq55r^)0PA9gT2Djt>zHX1)9?1x+mt zcOD$Z2bD^+PTGVr35gKEY-*Bu9o5i+PqUQld>QcwZ)LtdCBTn1(PX z!fmykHF9S3ZmjXwHlhR6#B!6*zi8=#p|Q3Q^{H;R4Khja*0eXEQxP=E1RsW^>K4Su zf<;x!R;~1|SWwAvfc{;!60uxXCi{8G+Nx-sYQB{bgTRrqzHQc#<63nu{(J*xaAj#F zLmo4r_tr}Pb)4h9oa8aPG}NkzTMetFWvdoc2{qDWIAGF%1Nb*QhqiKQYkRG)PANwv zm1bm{qp)I0e`}~)>IXW=RHdNqm z&a}387pX4cl%OKEy{VzmFK2v4b8JA$wSulJS+H_(*^&y3!PP4l3)zLTH_^Llrd*G| zb^%`~Z?>S0m`7t)Vsx}Ndl%xbvThJqrJB^=cQxIjdXxi;4KWR7S9$PD0eHEkHA-FV zTfeEHq_uT}K!B)GYL=GMLV*{5SQWlivy^myG#;^NbCtzJ-d0oV$28R5-V}|ZjWrz` z17^A+l9RIK+kV2!gj z6Dnr7Nx+gccWB61^S*bnsB7w|ZExDx)KY`^9lF$eH#hkkx%uEiF6UWu=H-eZ$NQyw zfSBgk20)IXA*+iF48{cB2hiYe6tPh-WR{c4F0+q{(ifY<*Q>fqV3tvnJ-UR8ow;mx z_}Z~y%4b-~TtPH9JDMwu=H{Tg5UE%tmMptzrFY5NMN2$#LRhq5^-U#J2nNpBc+CS> zB{igP#wI~^G8RA20_@Q6XN1`(72$}WOP3|9EF*I<26e^I-Gv;mDkQlmp@SNPuaPU^ zrp?&$4UKLOHi#-z&AkIQC+36}T?*wKgjEKw<;Ne5YQb7)#&~T_b2EzhI@>TUV_#WQ zkG-L#r@los*V-wfT~;(NU9hYSK`aL@x{|v^M44LE@YjZ;&Z#s9A{wd|?M2bi7K;&c zPbrO5p%pcpablXvXx`}CSlf2DRi0?ZqD|_G9rFIve;peYKk~ zAISX%CjXdqKL1S>QH-5|l|;1r{Y~;q?E|Cy#rSJme%toN91!U9s0fNng$yBhXf-x0 zE$zNq@GHG*mQ_@(UQjk@34}coQxFD$(;z^-Z-5Lp6DuvmiGz|D{=K$Q#J5h)2yT z;F}k6^JdnydeK5}eS7Ohc--7Gn}ZADRoFvU_>?&Ia^ALD%s;$l;iV{lUZ)^lr7ap- zo9kTpx%v5^EtrWfxpx+t3)#3iRZH-b!bB}eOV&p_GPE(;SYwqc(2n6cRDBY0G9u*dU<)UIEv`!~oP6Fvw&VP}bLulvmgnE1Q=e3c$Bx+2CC zTOuv_6BA>6+QU~as!yW$j)~KUlz#`%dK)6~{{U{i>yUUF28{IvL*jh@to4FI;`zX> zH~kS`3fy|F74a(I)~le1uLo|us)#uKF>5-$OAz#B0ioR_#$#6x#9{`3_2 zNHG77rThSQfzQA7$&aR|$$Gc&IVJf?5d1Z}^%;%KLg1W#SYH|r2djW{zEXIq;P3G` zpDBE#Xa~;u$>MhbPsGH08f_X4|Lg>AeW?EcaLya*qx;$H!N5c7e{CII%vg@1bEh-@R#l$nPD7e`y&0{4o6MHk{KsZw;`2k04L~eGjfZN9devUb0d`$yx z?_WN*Y<(C{^MG6Lmtz0(t(w;Bt=Rv3^w@eK6!}|ieDe z4HEGOfFA{J#T(yX=FW`GZ%2W9fWz%_eEbl&^_EJO9{_H>d6M|=fuD!`I#WIl^Q`q| zL-Hp8w>~ap+{5q%z^&ITP=3uYelu|E6Jx2+wR{{SPPy3KMS_9K0b(P$8Q9F%*OW&!}&7mb2k3H!*IUF(TVll(*N8r{59Z( zHvUhC;qL;s-ULAVJ^*h0QlB{ADsBDTo_IcR>o@YmOMqKHfG6$+ZteG-*uU2g!`p#7 zJdnYMd{Nu(R|hto*+PGfc zM>FqFH6e^3W5YJK;v6VSD2O5dPhscpBR3Jn@u8p!0)%LhQlTIbD>*2TK^;IoqJe@UeM&@mMUd!_XecP5NWmY01O*Zm9iQ);dG^@52P2LB z=DqK{8P9nAr5^e$MX&ao7?*+caG~vy@|8AFYGT?2Rf+OTG<{?`@#;jRyFk7 zs)0SK2(@zj5S(>buJ{Gg>S0quY*fiwiA)PEWHQVT%+WeV0h!Dr7%_264b&(n^txWm zmQ}fT0yT3~R`pyY6IK}I<90qH#wh)I8TRK(h>gjl{eVsSpmn{|DCxvb9dBaK*_PE? zQkP{EEIcC?tgKL5Dao)Qw9{5)wbS{jY(P_;GS*2GG4D+SL)0_)u|2vKg@bi;d@zgq zc`DCSnURkMqQKUJ*@L)`?d_Kh2pbz$P@X;Ly1HKu?J8zwvt~292_}ZifYhItRa-}i zVM>MArnV!*pwi<(u?XwYmQ;n=R8Dc#0(7LuH4}CN2RpO+HH-g!O>h zPIbAJZ{@MQ*VuEmIaBAX@?=)V!0NPZ(~X#rX35W`u*^fZPa?(*7k>VjxR)ymuD^2k zqr&dZp(qtqoa{}fED#BWt^X(vmg~Ud!NOwB#StO!LQ7xxFUW$wgCxRH!1Na@)*ck} zAQW=PBAuq561AY5eA)t*uGp1McY`9v(w%p6eOCnwJ+pBX*)- zS%IxRS%iWW5rZ{_zK#NKfikb$ngWG`OQxJeW`MkV1Si=uvstT_>%c=P=pgR1kVxqFc;oOsCF z;H2~9?W)Vt3n%{a(=+_N22f)xoOskjaDSyTyRLsXkmXaj`|zjt35=W~d-8Ta2IM$< zuiJG*+{>oakagVh=Q#HvmCLt~Rp*kFO1u0dwh3_~oAUE)wD?4OvTV=3;k{ZyN^W~fS+bAc_pE1qG&)|{esleEc3# zV$N1c9d3eyZs?M?dlkVxL&>rR_w5TIoTq%7EPpSP-vwvq0J74nKk_9$T_93&f0swN M$3HV~ZUpP%zdg593IG5A literal 0 HcmV?d00001 diff --git a/offloading_binaries/client_send_normaludp_sendfile/client_send_normaludp_sendfile_pc b/offloading_binaries/client_send_normaludp_sendfile/client_send_normaludp_sendfile_pc new file mode 100755 index 0000000000000000000000000000000000000000..deaecd8fdd6c78430c8ae0d81ac94fb24ed1db7c GIT binary patch literal 13877 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 B@KFE& literal 0 HcmV?d00001 diff --git a/offloading_binaries/client_send_normaludp_sendfile/main.c b/offloading_binaries/client_send_normaludp_sendfile/main.c new file mode 100644 index 0000000..cfbef47 --- /dev/null +++ b/offloading_binaries/client_send_normaludp_sendfile/main.c @@ -0,0 +1,250 @@ +/* + * Initial commit by Yibo @ Jul. 28, 2015 + * Last update by Yanzi @ Sept. 26, 2016 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUF_SIZ 65536 + +#if !defined SPLICE_F_MORE + # define SPLICE_F_MOVE 1 /* Move pages instead of copying. */ + # define SPLICE_F_NONBLOCK 2 /* Don't block on the pipe splicing + (but we may still block on the fd + we splice from/to). */ + # define SPLICE_F_MORE 4 /* Expect more data. */ + # define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */ +#endif + +char isNumber(char number[]) +{ + int i = 0; + + //checking for negative numbers + if (number[0] == '-') + i = 1; + for (; number[i] != 0; i++) + { + //if (number[i] > '9' || number[i] < '0') + if (!isdigit(number[i])) + return 0; + } + return 1; +} + +int main(int argc, char *argv[]) +{ + // for bandwidth control + uint slotLength = 10000; // in microseconds, for bandwidth control + uint quota = 1000000000; // default bytes per slot, default 1GB/slot + uint sentInSlot = 0, slot = 1; + uint total_bytes_sent = 0; + int bytes, bytes_sent, bytes_in_pipe; + // for timing + double elapsedTime; + struct timeval t_start, t_end, t_now; + // for socket + int fd; // file descriptor of file to send + int sockfd; // socket + // char ifName[IFNAMSIZ]; + // char sendbuf[BUF_SIZ]; + struct sockaddr_in servaddr; + // struct ether_header *eh = (struct ether_header *) sendbuf; + // struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + // struct sockaddr_ll socket_address; + // for misc + int ret; + int sendsize = 1472; // 1500 MTU - 20 IPv4 - 8 UDP + int bytes2send = 0; + struct stat st; + off_t offset = 0; + // create two pipes + int filedes[2]; + ret = pipe(filedes); + + if (argc < 4) + { + printf("Usage: %s <[optional] bandwidth (bps)> <[optional] sendsize (bytes)>\n", argv[0]); + exit(0); + } + + // set bandwidth + if (argc > 4) + quota = atoi(argv[4]) / 8 / (1000000 / slotLength); + + // set sendsize (if larger than 1472 will do packetization (fragmentation) (is this true??)) + if (argc > 5) + sendsize = atoi(argv[5]); + + // adjust slotLength to address packet size issue in the end + if ((quota % sendsize) > 0) + { + // printf("quota:%d,sendsize:%d,slotLength:%d\n", quota, sendsize, slotLength); + slotLength = (uint)((double)(quota / sendsize + 1) * sendsize / quota * slotLength); + quota = (quota / sendsize + 1) * sendsize; + // printf("quota:%d,sendsize:%d,slotLength:%d\n", quota, sendsize, slotLength); + } + + // get file size (bytes2send) + if (isNumber(argv[1])) + { + // set bytes to send + bytes2send = atoi(argv[1]); + // open file descriptor + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) + { + fprintf(stderr, "! Unable to open /data/local/tmp/bigfile.\n"); + exit(1); + } + } + else + { + // open file descriptor + fd = open(argv[1], O_RDONLY); + if (fd == -1) + { + fprintf(stderr, "! Unable to open file %s.\n", argv[1]); + exit(1); + } + fstat(fd, &st); + bytes2send = st.st_size; + printf("bytes2send:%d\n", bytes2send); + } + + // bind socket + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + bzero(&servaddr, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = inet_addr(argv[2]); + servaddr.sin_port = htons(atoi(argv[3])); + + if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) { + perror("connect failed\n"); + exit(-1); + } + + // start timing + gettimeofday(&t_start, NULL); + + // start to send + while (total_bytes_sent < bytes2send) + { + if ((bytes2send - total_bytes_sent) < quota) + { + quota = bytes2send - total_bytes_sent; + } + // initialize ret + // ret = 1; + // send in slots + while (sentInSlot < quota) + { + // printf( + // "before: total_bytes_sent %d, sentInSlot %d, quota - sentInSlot %d\n", + // total_bytes_sent, sentInSlot, quota - sentInSlot); + ret = sendfile(sockfd, fd, &offset, + ((quota - sentInSlot < sendsize) ? (quota - sentInSlot) : sendsize)); + + // // Splice the data from in_fd into the pipe + // if ((bytes_sent = splice(fd, NULL, filedes[1], NULL, + // (quota - sentInSlot < sendsize) ? (quota - sentInSlot) : sendsize, + // SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + // if (errno == EINTR || errno == EAGAIN) { + // // Interrupted system call/try again + // // Just skip to the top of the loop and try again + // usleep(100); + // continue; + // } + // fprintf(stderr, "! splice error, errno: %d.\n", errno); + // exit(1); + // } + + // // Splice the data from the pipe into out_fd + // bytes_in_pipe = bytes_sent; + // printf("bytes_in_pipe %d, err:%d\n", (int)bytes_sent, errno); + // while (bytes_in_pipe > 0) { + + // if ((bytes = splice(filedes[0], NULL, sockfd, NULL, bytes_in_pipe, + // SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + // if (errno == EINTR || errno == EAGAIN || errno == EMSGSIZE) { + // // Interrupted system call/try again + // // Just skip to the top of the loop and try again + // fprintf(stderr, "! sleep 100, err:%d.\n", errno); + // usleep(1000); + // continue; + // } + // fprintf(stderr, "! splice error, errno: %d.\n", errno); + // usleep(1000); + // continue; + // } + // bytes_in_pipe -= bytes; + // // printf("bytes_in_pipe %d, value %d, err:%d\n", (int)bytes_in_pipe, (int)bytes, errno); + // } + + // total_bytes_sent += bytes_sent; + // sentInSlot += bytes_sent; + + if (ret <= 0) + { + fprintf(stderr, "! Fail to send: ret:%d, err:%d; wait for 100us..\n", ret, errno); + usleep(100); + // offset -= ((quota - sentInSlot < sendsize) ? (quota - sentInSlot) : sendsize); + continue; + } + sentInSlot += ret; + total_bytes_sent += ret; + // printf( + // "total_bytes_sent %d, sentInSlot %d, quota - sentInSlot %d\n", + // total_bytes_sent, sentInSlot, quota - sentInSlot); + } + // control bandwidth + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec - t_start.tv_sec) * 1000000.0 + (t_now.tv_usec - t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + // printf( + // "sent %d, quota %d, bytes2send %d, usleep %lfus\n", + // total_bytes_sent, quota, bytes2send, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + ++slot; + } + + ret = sendto(sockfd, "=?!\n", 4, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); + if (ret <= 0) + { + fprintf(stderr, "! Unable to end data transfer. errno:%d.\n", errno); + close(sockfd); + close(fd); + exit(1); + } + + // end timing + gettimeofday(&t_end, NULL); + elapsedTime = (t_end.tv_sec - t_start.tv_sec) + (t_end.tv_usec - t_start.tv_usec) / 1000000.0; + printf( + "sent(bytes):%d\nduration(s):%lf\nthroughput(bps):%lf\n", + total_bytes_sent, elapsedTime, total_bytes_sent * 8 / elapsedTime); + + close(sockfd); + close(fd); + + return 0; +} diff --git a/offloading_binaries/client_send_normaludp_sendfile/main.o b/offloading_binaries/client_send_normaludp_sendfile/main.o new file mode 100644 index 0000000000000000000000000000000000000000..4e9e85de390728c5eee4e5b9e0f0e1678a220d28 GIT binary patch literal 5000 zcmb7IU1%KF6+WX`*|Oy}TU%*lOLebn$yvGbYOJgiMKP&b>wnCvLHYKzwHjN)bXz>R6U`ieo=tC$@Fti0@Tp~yaqV
e424!G%1P(Cv3- z@7*0w?AEzr_q*rZbI(10_spz*bYyBm(=<{;qXac6qO0EsR$5a5BxoCLq1f_)DlPwf zy<_FrdYsy;WRy4BjP`2W=)(M?>H#{j0Uf(E$!{n6tPN{%(N)!r*Vb6ZFvi!n)aBmd z{ad7rW}IJVT~T?0>_2O@K&MXS3aw18$CiKf*WI;&%H8JO0^SbtOC1%e7*p(y*-jn0Iy-)kaUXIm0n{~u+Q>O;*gRXVXoYgcfJ|VU0FC{dVBco7NAg-At3$T? zE68>}j4aLy+sCuIyDbcmbc$c&#~SS$wnvdW;xb|KQMA<6QP}NX9KLW1#8=z2Y}ZPc-X-<0K%H z4R~M9`Lr<^+$ojgpP@gdP^$^lP>aZ*UXdSqsiG6@Z}1J~w^t8Amg~A3c@dD)z-L*+ z@t`isdsLi`NAmozdz6pxEy(i-@;ribxJP^)JyG=}x{iK0$UehA)ZL|Ej(dT+8-ab> zkO!8vsICY7=`+@oz#2a%xCb*WB+WgV=gRj#)@s96Bu*CAr?ICc@LBdKt__@}dK%YZ z8*B;eRBN-ybD>iM=rs{%o@78KRJrjx5nft|R1hG0^uAKTGaR|rpx^ZtDWAL{X z{)S`AG2*&C&(AKbhu4&@Mtr27cg3G73(&3lXd>QKRWe+Etb==$jKc=&?Z7+1-Phm$ z`)w3b{BgXn+;`>e84MjH?;<`)Vj2q7{7kLc+5 z_^?PEeg0&hNF|>ZgT}#>F*Nv;NEC{8(azeYXZO+Qewbw1X4)Z5VA^_U`Uq``wP{qN%Q<=_A% z^R90vVbB53H#09&a`dHRNz?a>PP&Ag;q>STms5=XRSU1{_q=5j>G%r|oluyep;Ifh zg=qLnc&`pd9N!w~$ACOnbRt+)Us|xg+)xs>j?c#>2@Rd(MUgxmyT2>vmw?-GV*NKk zoylj8$#n*%Pekb12%U}4ixK)K5&Ck3emg=hN9gw>^i9xg`xIip_J0^z|0F{HB|@)7 zXgu&5gZ;hJpz8jA9-;pop+i5rf_SxuQo{OnL}(GAdn5Gz2t62~pN`Pqi_j+{H04Yu zpUhB?MNa-n)3S;)W`40T&$@0Q%{QUPB*%NcluO%1nwbf%<4no1oLBCpa;_C(3^oZT zG`Di4Y(vTl>#zn(&a2HOnA0ROxx&2PB)w9)Nep5aJ3@t`llSMyKIiyk`mRIVJ8AB0 z(eZ7XldE&M+&+13=4IQ5r?x-Cev@p6G;jO9le679%Uq+5$kUJm`E{p6IqPkB3fd6gy@$N zKbHJEj3|n>mil@pBYvAF81XW3m~jWuwB#=^cHp@t>C1BcD&wO>*BNonT}HgLb)x<7 z`3B=|*u(g3qAVlqTax@+jDqN6$-l$6ho}SXiv8(f{0{CJ<6fd`jL@6Fv$ng3=oBOL z&N4!8fw33*821rvL)+=bvs*BtflV>uylKWhqBj{K{|+PkzQG8;??{^4ST}xH3r56e zh!KtPl%xxcop|mu?u4C;(EA5Q=v`%m-p?h*(JMHPJ&e#h!U(;mB>#tu@cRNIo<>U& zxzFxI!(0aH@a;W`*CbvC?&`<6lD;AFmc$i_s}fN%4>b^4bT(>q?-b^@p+gO%BN#9l z|H*+r0Y!8UwP2tY_#w~xS&p|MBms>y2P4j#LW5;_@UwyC|DT)z8Qz1Vg2DP;S4zN9 z_6=dqY?kNoCJftGp9bH&#-CA%0TW*zumhpNGCW?y2euUg0$(hro@dNca!75%2j+hY pIg=-HC^<&u120Xr6Rm&&AY7-w4_wzE#wsQtgS+;9r3AE^{ufUXW-9;y literal 0 HcmV?d00001 diff --git a/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/Makefile b/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/Makefile new file mode 100644 index 0000000..7d11547 --- /dev/null +++ b/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/Makefile @@ -0,0 +1,18 @@ +#CC = /media/Lucifer/android/lib/android-18-toolchain/bin/arm-linux-androideabi-gcc +CC1 = arm-linux-androideabi-gcc +CC2 = gcc +CFLAGS = -pie -fPIE +TARGET1 = client_send_bypassl3_sendfile +TARGET2 = client_send_bypassl3_sendfile_pc + +all: $(TARGET1) $(TARGET2) + +$(TARGET1): main.c + $(CC1) main.c -Wall $(CFLAGS) -o $@ + +$(TARGET2): main.c + $(CC2) main.c -Wall $(CFLAGS) -o $@ + +clean: + -rm -f $(TARGET1) + -rm -f $(TARGET2) diff --git a/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/client_send_bypassl3_sendfile b/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/client_send_bypassl3_sendfile new file mode 100755 index 0000000000000000000000000000000000000000..f2a674e1b30170fa7d8886e943e74ed275d3ba92 GIT binary patch literal 51832 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 B*Q)>k literal 0 HcmV?d00001 diff --git a/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/main.c b/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/main.c new file mode 100644 index 0000000..1a74ba8 --- /dev/null +++ b/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/main.c @@ -0,0 +1,288 @@ +/* + * Initial commit by Yibo @ Jul. 28, 2015 + * Last update by Yanzi @ Sept. 26, 2016 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0x18 +#define MY_DEST_MAC1 0x03 +#define MY_DEST_MAC2 0x73 +#define MY_DEST_MAC3 0xc8 +#define MY_DEST_MAC4 0x86 +#define MY_DEST_MAC5 0x52 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 4096 + +char isNumber(char number[]) +{ + int i = 0; + + //checking for negative numbers + if (number[0] == '-') + i = 1; + for (; number[i] != 0; i++) + { + //if (number[i] > '9' || number[i] < '0') + if (!isdigit(number[i])) + return 0; + } + return 1; +} + +int main(int argc, char *argv[]) +{ + // defaults + uint slotLength = 10000; // in microseconds, for bandwidth control + uint quota = 1000000000; // default bytes per slot, default 1GB/slot + uint sentInSlot = 0, slot = 1; + uint total_bytes_sent = 0; + off_t offset = 0; + // for timing + double elapsedTime; + struct timeval t_start, t_end, t_now; + // for socket + int i, j, fd; // file descriptor of file to send + int sockfd; // socket + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ifreq if_idx; + struct ifreq if_mac; + struct sockaddr_in servaddr; + struct ether_header *eh = (struct ether_header *) sendbuf; + // struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + // for misc + int ret; + int sendsize = 1500; // 1500 MTU (raw socket) + int bytes2send = 0; + struct stat st; + unsigned char my_dest_mac[6]; + + if (argc < 3) + { + printf("Usage: %s <[optional] bandwidth (bps)> <[optional] sendsize (bytes)> <[optional] interface>\n", argv[0]); + exit(0); + } + + // set bandwidth + if (argc > 3) + quota = atoi(argv[3]) / 8 / (1000000 / slotLength); + + // set sendsize (if larger than 1460 will do packetization (fragmentation)) + if (argc > 4) + sendsize = atoi(argv[4]); + + // set interface + if (argc > 5) { + strcpy(ifName, argv[5]); + } else { + strcpy(ifName, DEFAULT_IF); + } + + // adjust slotLength to address packet size issue in the end + if ((quota % sendsize) > 0) + { + // printf("quota:%d,sendsize:%d,slotLength:%d\n", quota, sendsize, slotLength); + slotLength = (uint)((double)(quota / sendsize + 1) * sendsize / quota * slotLength); + quota = (quota / sendsize + 1) * sendsize; + // printf("quota:%d,sendsize:%d,slotLength:%d\n", quota, sendsize, slotLength); + } + + // get file size (bytes2send) + if (isNumber(argv[1])) + { + // set bytes to send + bytes2send = atoi(argv[1]); + // open file descriptor + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) + { + fprintf(stderr, "! Unable to open /data/local/tmp/bigfile.\n"); + exit(1); + } + } + else + { + // open file descriptor + fd = open(argv[1], O_RDONLY); + if (fd == -1) + { + fprintf(stderr, "! Unable to open file %s.\n", argv[1]); + exit(1); + } + fstat(fd, &st); + bytes2send = st.st_size; + printf("bytes2send:%d\n", bytes2send); + } + + if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) + { + fprintf(stderr, "! raw socket error.\n"); + exit(1); + } + + // Get the index of the interface to send on + memset(&if_idx, 0, sizeof(struct ifreq)); + strncpy(if_idx.ifr_name, ifName, IFNAMSIZ - 1); + if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) + { + fprintf(stderr, "! SIOCGIFINDEX error. Check permission.\n"); + exit(1); + } + + // Get the MAC address of the interface to send on + memset(&if_mac, 0, sizeof(struct ifreq)); + strncpy(if_mac.ifr_name, ifName, IFNAMSIZ - 1); + if (ioctl(sockfd, SIOCGIFHWADDR, &if_mac) < 0) + { + fprintf(stderr, "! SIOCGIFHWADDR error. Check permission.\n"); + exit(1); + } + + // Set mem + memset(sendbuf, 0, BUF_SIZ); + + // parse input MAC address + sscanf( + argv[2], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", + &my_dest_mac[0], &my_dest_mac[1], &my_dest_mac[2], + &my_dest_mac[3], &my_dest_mac[4], &my_dest_mac[5]); + + printf("destMAC:%02x:%02x:%02x:%02x:%02x:%02x\n", + my_dest_mac[0], my_dest_mac[1], my_dest_mac[2], + my_dest_mac[3], my_dest_mac[4], my_dest_mac[5]); + + // Construct the Ethernet header + eh->ether_shost[0] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[0]; + eh->ether_shost[1] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[1]; + eh->ether_shost[2] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[2]; + eh->ether_shost[3] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[3]; + eh->ether_shost[4] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[4]; + eh->ether_shost[5] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[5]; + eh->ether_dhost[0] = my_dest_mac[0]; + eh->ether_dhost[1] = my_dest_mac[1]; + eh->ether_dhost[2] = my_dest_mac[2]; + eh->ether_dhost[3] = my_dest_mac[3]; + eh->ether_dhost[4] = my_dest_mac[4]; + eh->ether_dhost[5] = my_dest_mac[5]; + eh->ether_type = htons(ETH_P_IP); + tx_len += sizeof(struct ether_header); + + // Index of the network device + socket_address.sll_ifindex = if_idx.ifr_ifindex; + + // Address length + socket_address.sll_halen = ETH_ALEN; + + // Destination MAC + socket_address.sll_addr[0] = MY_DEST_MAC0; + socket_address.sll_addr[1] = MY_DEST_MAC1; + socket_address.sll_addr[2] = MY_DEST_MAC2; + socket_address.sll_addr[3] = MY_DEST_MAC3; + socket_address.sll_addr[4] = MY_DEST_MAC4; + socket_address.sll_addr[5] = MY_DEST_MAC5; + + if(bind(sockfd, (struct sockaddr *) &socket_address, sizeof(struct sockaddr_ll)) < 0) { + perror("bind\n"); + exit(-1); + } + + + ret = sendto( + sockfd, sendbuf, sendsize, + MSG_DONTWAIT, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)); + // fprintf(stderr, "! Fail to send: ret:%d, err:%d; wait for 100us..\n", ret, errno); + + + // start timing + gettimeofday(&t_start, NULL); + // read(fd, sendbuf + tx_len, sendsize - tx_len); + + // start to send + while (total_bytes_sent < bytes2send) + { + if ((bytes2send - total_bytes_sent) < quota) + { + quota = bytes2send - total_bytes_sent; + } + // send in slots + while (sentInSlot < quota) + { + // printf( + // "before: total_bytes_sent %d, sentInSlot %d, quota - sentInSlot %d\n", + // total_bytes_sent, sentInSlot, quota - sentInSlot); + + ret = sendfile(sockfd, fd, &offset, + ((quota - sentInSlot < (sendsize - tx_len)) ? (quota - sentInSlot) : (sendsize - tx_len))); + + // read( + // fd, sendbuf + tx_len, + // ( + // ((quota - sentInSlot) < (sendsize - tx_len)) ? + // (quota - sentInSlot) : (sendsize - tx_len)) + // ); + // ret = sendto( + // sockfd, sendbuf, + // (quota - sentInSlot < sendsize) ? (quota - sentInSlot) : sendsize, + // MSG_DONTWAIT, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)); + + if (ret <= 0) + { + fprintf(stderr, "! Fail to send: ret:%d, err:%d; wait for 100us..\n", ret, errno); + usleep(100); + continue; + } + total_bytes_sent += ret; + sentInSlot += ret; + // printf( + // "after: total_bytes_sent %d, sentInSlot %d, quota - sentInSlot %d\n", + // total_bytes_sent, sentInSlot, quota - sentInSlot); + } + // control bandwidth + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec - t_start.tv_sec) * 1000000.0 + (t_now.tv_usec - t_start.tv_usec); + if (elapsedTime < (slotLength * slot)) + { + // printf( + // "sent %d, quota %d, bytes2send %d, usleep %lfus\n", + // total_bytes_sent, quota, bytes2send, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + ++slot; + } + + // end timing + gettimeofday(&t_end, NULL); + elapsedTime = (t_end.tv_sec - t_start.tv_sec) + (t_end.tv_usec - t_start.tv_usec) / 1000000.0; + printf( + "sent(bytes):%d\nduration(s):%lf\nthroughput(bps):%lf\n", + total_bytes_sent, elapsedTime, total_bytes_sent * 8 / elapsedTime); + + close(sockfd); + close(fd); + + return 0; +} diff --git a/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/main.o b/offloading_binaries/old/client_send_bypassl3_sendfile_DNW/main.o new file mode 100644 index 0000000000000000000000000000000000000000..4e9e85de390728c5eee4e5b9e0f0e1678a220d28 GIT binary patch literal 5000 zcmb7IU1%KF6+WX`*|Oy}TU%*lOLebn$yvGbYOJgiMKP&b>wnCvLHYKzwHjN)bXz>R6U`ieo=tC$@Fti0@Tp~yaqV
e424!G%1P(Cv3- z@7*0w?AEzr_q*rZbI(10_spz*bYyBm(=<{;qXac6qO0EsR$5a5BxoCLq1f_)DlPwf zy<_FrdYsy;WRy4BjP`2W=)(M?>H#{j0Uf(E$!{n6tPN{%(N)!r*Vb6ZFvi!n)aBmd z{ad7rW}IJVT~T?0>_2O@K&MXS3aw18$CiKf*WI;&%H8JO0^SbtOC1%e7*p(y*-jn0Iy-)kaUXIm0n{~u+Q>O;*gRXVXoYgcfJ|VU0FC{dVBco7NAg-At3$T? zE68>}j4aLy+sCuIyDbcmbc$c&#~SS$wnvdW;xb|KQMA<6QP}NX9KLW1#8=z2Y}ZPc-X-<0K%H z4R~M9`Lr<^+$ojgpP@gdP^$^lP>aZ*UXdSqsiG6@Z}1J~w^t8Amg~A3c@dD)z-L*+ z@t`isdsLi`NAmozdz6pxEy(i-@;ribxJP^)JyG=}x{iK0$UehA)ZL|Ej(dT+8-ab> zkO!8vsICY7=`+@oz#2a%xCb*WB+WgV=gRj#)@s96Bu*CAr?ICc@LBdKt__@}dK%YZ z8*B;eRBN-ybD>iM=rs{%o@78KRJrjx5nft|R1hG0^uAKTGaR|rpx^ZtDWAL{X z{)S`AG2*&C&(AKbhu4&@Mtr27cg3G73(&3lXd>QKRWe+Etb==$jKc=&?Z7+1-Phm$ z`)w3b{BgXn+;`>e84MjH?;<`)Vj2q7{7kLc+5 z_^?PEeg0&hNF|>ZgT}#>F*Nv;NEC{8(azeYXZO+Qewbw1X4)Z5VA^_U`Uq``wP{qN%Q<=_A% z^R90vVbB53H#09&a`dHRNz?a>PP&Ag;q>STms5=XRSU1{_q=5j>G%r|oluyep;Ifh zg=qLnc&`pd9N!w~$ACOnbRt+)Us|xg+)xs>j?c#>2@Rd(MUgxmyT2>vmw?-GV*NKk zoylj8$#n*%Pekb12%U}4ixK)K5&Ck3emg=hN9gw>^i9xg`xIip_J0^z|0F{HB|@)7 zXgu&5gZ;hJpz8jA9-;pop+i5rf_SxuQo{OnL}(GAdn5Gz2t62~pN`Pqi_j+{H04Yu zpUhB?MNa-n)3S;)W`40T&$@0Q%{QUPB*%NcluO%1nwbf%<4no1oLBCpa;_C(3^oZT zG`Di4Y(vTl>#zn(&a2HOnA0ROxx&2PB)w9)Nep5aJ3@t`llSMyKIiyk`mRIVJ8AB0 z(eZ7XldE&M+&+13=4IQ5r?x-Cev@p6G;jO9le679%Uq+5$kUJm`E{p6IqPkB3fd6gy@$N zKbHJEj3|n>mil@pBYvAF81XW3m~jWuwB#=^cHp@t>C1BcD&wO>*BNonT}HgLb)x<7 z`3B=|*u(g3qAVlqTax@+jDqN6$-l$6ho}SXiv8(f{0{CJ<6fd`jL@6Fv$ng3=oBOL z&N4!8fw33*821rvL)+=bvs*BtflV>uylKWhqBj{K{|+PkzQG8;??{^4ST}xH3r56e zh!KtPl%xxcop|mu?u4C;(EA5Q=v`%m-p?h*(JMHPJ&e#h!U(;mB>#tu@cRNIo<>U& zxzFxI!(0aH@a;W`*CbvC?&`<6lD;AFmc$i_s}fN%4>b^4bT(>q?-b^@p+gO%BN#9l z|H*+r0Y!8UwP2tY_#w~xS&p|MBms>y2P4j#LW5;_@UwyC|DT)z8Qz1Vg2DP;S4zN9 z_6=dqY?kNoCJftGp9bH&#-CA%0TW*zumhpNGCW?y2euUg0$(hro@dNca!75%2j+hY pIg=-HC^<&u120Xr6Rm&&AY7-w4_wzE#wsQtgS+;9r3AE^{ufUXW-9;y literal 0 HcmV?d00001 diff --git a/offloading_binaries/old/test_splice/a.out b/offloading_binaries/old/test_splice/a.out new file mode 100755 index 0000000000000000000000000000000000000000..e96fd15fa6e5541f3cb028294306c41951723aa4 GIT binary patch literal 13464 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 Av;Y7A literal 0 HcmV?d00001 diff --git a/offloading_binaries/old/test_splice/test_splice.c b/offloading_binaries/old/test_splice/test_splice.c new file mode 100644 index 0000000..d11e389 --- /dev/null +++ b/offloading_binaries/old/test_splice/test_splice.c @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2009 Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + */ + +/* + * This tiny program prints a matrix: which file descriptor + * combinations are supported by splice()? + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +static struct { + const char *const name; + int in, out; +} fds[] = { + { .name = "pipe", }, + { .name = "reg", }, + { .name = "chr", }, + { .name = "unix", }, + { .name = "tcp", }, + { .name = "udp", }, +}; + +enum { + NUM_FDS = sizeof(fds) / sizeof(fds[0]), +}; + +int main(int argc, char **argv) +{ + int f[2], ret; + unsigned x, y; + char template1[] = "/tmp/test_splice.XXXXXX"; + char template2[] = "/tmp/test_splice.XXXXXX"; + + (void)argc; + (void)argv; + + /* open two file descriptors of each kind */ + + fds[0].in = pipe(f) >= 0 ? f[0] : -1; + fds[0].out = pipe(f) >= 0 ? f[1] : -1; + fds[1].in = mkstemp(template1); + fds[1].out = mkstemp(template2); + fds[2].in = open("/dev/zero", O_RDONLY); + fds[2].out = open("/dev/null", O_WRONLY); + fds[3].in = socketpair(AF_UNIX, SOCK_STREAM, 0, f) >= 0 ? f[0] : -1; + fds[3].out = socketpair(AF_UNIX, SOCK_STREAM, 0, f) >= 0 ? f[0] : -1; + fds[4].in = socket(AF_INET, SOCK_STREAM, 0); + fds[4].out = socket(AF_INET, SOCK_STREAM, 0); + fds[5].in = socket(AF_INET, SOCK_DGRAM, 0); + fds[5].out = socket(AF_INET, SOCK_DGRAM, 0); + + /* print table header */ + + printf("in\\out"); + for (x = 0; x < NUM_FDS; ++x) + printf("\t%s", fds[x].name); + putchar('\n'); + + for (y = 0; y < NUM_FDS; ++y) { + fputs(fds[y].name, stdout); + + for (x = 0; x < NUM_FDS; ++x) { + putchar('\t'); + + if (fds[x].out < 0 || fds[y].in < 0) { + fputs("n/a", stdout); + continue; + } + + ret = splice(fds[y].in, NULL, fds[x].out, NULL, 1, + SPLICE_F_NONBLOCK); + if (ret >= 0 || errno == EAGAIN || errno == EWOULDBLOCK + || errno == ENOTCONN) + /* EAGAIN or EWOULDBLOCK means that the kernel has + accepted this combination, but can't move pages + right now */ + fputs("yes", stdout); + else if (errno == EINVAL) + /* the kernel doesn't support this combination */ + fputs("no", stdout); + else if (errno == ENOSYS) + /* splice() isn't supported at all */ + fputs("ENOSYS", stdout); + else + /* an unexpected error code */ + fputs("err", stdout); + } + + putchar('\n'); + } + + unlink(template1); + unlink(template2); +}