From d88cf5d2d533a2039f6442eb4b6bb9a4503c8c36 Mon Sep 17 00:00:00 2001 From: Barnavon Jules-Ian Date: Wed, 12 Apr 2023 15:17:00 +0200 Subject: [PATCH] mictcp_v3 en cours --- build/client | Bin 51552 -> 52072 bytes build/gateway | Bin 63848 -> 64368 bytes build/mictcp.o | Bin 35728 -> 37072 bytes build/server | Bin 51512 -> 52032 bytes src/mictcp.c | 74 ++++++++++++++++++++++++++++++++++++++----------- 5 files changed, 58 insertions(+), 16 deletions(-) diff --git a/build/client b/build/client index 76a2922a587a4d0ca7314a20dfe6df58ec0bd013..0af511eb992bd2d6a672c75e09a8d13a21468631 100755 GIT binary patch delta 12008 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 Bs;2+| diff --git a/build/gateway b/build/gateway index 26257e559a827411d8f5b3fc051fb3c802e96dac..a70a40822f035390975dbbdaeea1c5af8d0a7c1b 100755 GIT binary patch delta 12007 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 diff --git a/build/mictcp.o b/build/mictcp.o index 1a3d1b3a9d63e02b27d8bf932038258c2ceb03a3..158d68c34cacef986ab605f07338d3fed51a7820 100644 GIT binary patch literal 37072 zcmdsgdwf*I`S&@yImzZivLOM&MOf|uNy1$&K@*dOglptd5y5rYY%Y@Q#=UUyQd0u` z8B&uRSA4|qCmr2D4kDJ?qYOJL-D8=Z;ln2wK-$E{yhdOz-O`?d$OLb(HjVxcfR>ebcFIsYln3 ztC076RjJYAeXIMJK)b!~b=~})u_NorJ_u(sk8{Op)pf7UcMmN1ScW4D@$8@y zV3OtB-8X~f;_vh`Og|u^heb-<{S}Royqgt~psRIN9+Y@9QbtL}~qAX#L}A>!;$g z37*ezfa49sD0m{n(F6{DL991Ef%SNXqu{CDZtt7Nyr;2yJ@0+XeBS$4<9YAfM%^** zJ80x%-g9`74mpr!;CvVAkbUuUeerkt;-~xKr;^&W>&G52S8tE^csH0(8>kAN@V-#+ zL~n|e)YW{3`f6RzS`$W~TGO3WZue_--OuyL<4G-o+XYt>kV_tv)wOsKQnOFTk{+#340nm?BVbv?&{5X3ao6@QKLc@`-v8V zXUXelUWC+?g6yXnJ$#a!W8fUZb+h8|R8G|vpVowDcc+%aMwFv;%sR6HofPVnpcRk-mM9_QT+F4e&$0TQd=8E=m(Fn3W& zJ>K_{^sTDvK3CWMcR6DLcU*V8FJ9Ug_w>a}`r>XiXC01<%Jc7-_Z4jFvl(69S4`Pj z^S!U!d~uKWl>vHY!4t&}7()j)&3`ujyqznar%En(+&ik$EZBV)3}gdK6K#=MusaG& zRl>lzz{8xv4U5t12hvt}eJa90&(>6YcAmuGasezDTn1#>gUbc-PSc|m94cn9pPlpx>vBD ztiTA(eXF5cT!DS(9q2~j^wlL0PjYF@Sl11zi#p1YOf5;dKQjwv$l$0Kp`-o`9xd#& z&%ph_^^s57g56&Q=BIL6e3R+%{?DD34f^Sv@R;{aoR$q-Cwj7Ud(p@633uT>_NhGO z!tFJX%MRp9XEwmQ6*p|1(y)~m*031`y9a-&hW-DfH3qb4Cb%xzbQip?S~#k&D83+n zn*U6}?q6N7-M{_+wB0|s!d<=Q1w4=jGW5V@4Ado3=lmb{O&DR}CCXc>OhnYKd*+|e zRNTo9iD7M^C!H8Eodvu10#g-}T4^5U;JJY#rkX*#l=o{S%pTG<~VZTQdLISd*$#${P2dgM(hm9DE?tl9A3f%kCNX!FANG-uRVp9Szr2 z@|}Ai5uf6n`>e4yY4$1Be&kbCyzR+1VI4@l?i1^{pw*P61GAw1Xsk~p;UiF6yMlEq zp1_{J8D4qM4>0W&9^3~rdnn6*RWK}blf8b3l0GRrc;oUzn}AK zpm?XjDnrfD0LeZe%EOnN6l)gfl?9KdT5duAOq(()P0ABqck0C(d?iVpf)lR(%RtaI zQ=+A*QE0qTI3&V|n1XON>Fr1D?#aF7TCmhZjdeX46LGqW?}RgYRW{iFAvSrB*PWsy zepT=G9!%UmnYaaUa<#qNdpvRbQsVYx;`UVH_B0x)7v2w^JD92wq2?t$UQY^r!0Z!J zn;r6$_IRhK&NDl89&m|yxRltxxgceJ>J-&}d%=L`8tZ0B`^GFW8YO&n4Rj88pnV|L z_>b0guQ*lLz3DW(GK&`uHasYPs>gdel@d>Q-%73cUU-Koy*e=-KtUd8Yu-GNqaq09 zWdP`01MUiRopZ*QV`T;;(sW=gywm|z-4m(9x4TzmvG8_vcGf4#660G&Jm+cb-Xdet z`puceFnlVzC1Q-}j=$Hl?mZNp%4rhIb(|0Ojc6VCnD;!Eb9Rmx5Rbz~O@DjrDTc)n z>CEO!1&F4=4p(3qT#@nV9YRrkw`Ee@w7qI(;klnw=)tCsaR-hxD~T?z-NJB9PRY9P4+iN zg3)NuvmnQ_I@lhL1wGY`0`k;1EbvS$pBl|Ew1kFmBnC+>aokpeutsR%iGorf$1|~U znrF>bD?MwxE7y7!K{UsRwYCStaZpr*P&nkF&ooc$jn1zHqn-|b)DsAYLcu`n=))eP zBN7fAeF!S?M1iqLIKCC=4YliphLK<(ZX7+3u)+eP0VJXF)iukYDmjLK zt3MR;1R_B{+TIgufxAY--vOn9!WztSF|&}307jr9qH^0&Mi81|2WkODaWTR!dUlT= zw2p5Lf(=S*!|}~+;m{P1P`;nch%FRKZ1l(cqI|F;l;H=b2!Os|*98VQH)zxtjK*3+ zvR(^pCJPcmTCv7KkF>sBGFHuF)L?6g3ZXl0ZfgzN1Q1@E(4lQ|KYx{eFtDG4`8|?X zcEKTMB6uqrXK|aq89gz_SX{qSiDA+uKDws$hM-h~5wr^+qFbq$r#0$Xxo-J#tnnvTm%H5J z);2J8FdB%ocErM{7u2}EcDdK6S-xtGx7L9A`mi60o7LVLZ~bQg^{!c4efjeGHFa>0 z#QK#>z-l$#hP8NiWp%x{Qnzl1gk#}AxXrT$`!^H;CZ?qRBZZcrm{1!-5`)X~aKI13 z`&k%jLU~fA)i>}!Wt&qQmW;-u4{wggsLy&DC!=e__!s03KG~QU^}s;d)*1>5%Sm@L z+FJv@SfIlvM-Ib|Z*C1WB8Aiafk3bW1~raDzu2m#2in5Xpz#_kyyL5*VYtKqpC|5> zKffB0h~RFU;rPX{`EYT%aNpc;W{69M%W1kqTx_QsP7}A54Uxe)X;?in9pVusq0&(e z09hGUYbZvnsY9!fM=xkNWGu(4v(?rzIHETTHQ)IS?xS;$&075=+tT|4+7dcC_ zhq`{mIkQU?FU%h9t^#s~keNL~q_|{clt{^w5syf5%gDIw>mX0DjEonNp)xX|cp(&1 zVz^x{zx7{SqAO60g^;d|B9dVgx?I;3I-!dX#x&QpQxo^WEYy~JG6=iQDhHw{!_}q= zYflJkE^M%cwJO3wSvfe42t!PFZFGGbVnwK%QG`NeZCxF1#AO9t*NaGrEH5JL;E|E2 zh)j@?n4py!c~v0nFk~0rV@mtyj2wx+R9Ko*ll@Of6Sd6oj#>gG%lpNy1imB>2NCI8 z77R2((qxiU=R5`i3a95R%f1ZKWbPFs?ds;NbS3arV=}RB!b?}NqzaPM;4B2lnE~R^ zyy8-f_qmo+xTSENypp180F(E_i?6ruM-=aZ`$G4iSFPi$$e@!siThvYp0x4b7q_;0(#ir~>NXX=V;QlZL`A{WZnCL;Q87!3|>=@}-Evq4_I5 zNkoPaWQo6-;%}C0%EIAJEMFBjCV#soj;Ld%T?Gkp*eRUg{vkv}TNF;pLnBdSayAZS zvIiBG7UTGzM*^lecd>wy!gBWq5GiSD1SeJopTZe~u{Lt>DV#Y3OL0;DSCcM0sjO#37}5MSms@7K@0hB)TJH6fP;O z$Lf^8Yk*N$CnAGN;PuETtQV1dDs-uHJ{RgKT;+b%F7%4Qr~nnZx(I9FraWt$-@#a} znVX#ndI(j_yezz@$RII=$dTO`2Up>e*)qSG?|cLE&oc|N+wJ^C1!!c-UtEmFlp~lq zLHYZtFhK^3o#W7V!OAB#))X^z!9P1M3 zC?VG)&Jp6RQ6c_9S^GZ=vw({*W_lbKW5ltqh2!&Z9^ly52m=TjX0)IUaR~MB9s@r6 zFqr#K+mePjhF}dG`!R>;v;ssaYN6|5GCWP7|e|r7~dl zF8O~l%h59&`|S99%%(QNw?XO zUbZDYZ4Q+!)kb+9OU|>@&XWnpgr$uhOXQKQdtY*%UOUeUJI{UQFe+yvrf!0SL~k(i zaB_*5FytU33o}Y<<|eF(odJWn|4MkQNo(eslas8OYhH@=ckVk#?UiqmtJhAFxeX&E zW)AR_heBkdjxh_Qlm;1}V-`r?t269ew^Li@L)nt$wR0s{gNQZTW?hqDd02yQ5=+X7 zB^btJq?mt8@_>Vs&D?(yq?SqsHQPptPLMv-K+$q(?DfLfry*Cu*m6AlkgU=uqaPLh z6-e0EL{nf6(G+<`7M7Xm!pDQu?NE|#_meHn{fz~z+aaNwbKj9$q&9~p$u4w|(4G&H5tb4;l+{Du9~rWk5Cb)Dn>G zV!NQw;i`&`5}02Iffdwp?(S$-_0drBpTHOekgwDQ^Q)sbm{4ra?2yp$0rm3F<1F0vlt1<}?mMmov?e z@(00R6T2VAqmh775syYH+FCbPGzS6|+vm;o&7EBa>xJ>{WzC^@#r%raP@pZ|7?eDU z^yh7EjYThjQW4wH5lki~=L!X3#UA!RxKvzvgq6zj0O}i!H8uvD%3HAdLJ-`-7#NL3 z;(?fNas6^H02v0Xi1QufXbl4hP8Zz~^}#MuTWd5Xv&o%~vS^Dx5^OB%FHdYUNot4W zDx7wItcB!45usRF9R7qPyA`kSA{vJcnpmS`!M;woBjyW)BSA^R4I`OEHEc1!L#ZH{ zU|6P+O%D}l!d}C)9Dj5bxr(gP16EO!HP&^~Dt^-%)@)hdv5FkiimZYz%Q|7@v{=Ko zS!VMb%i$OgbjXl-z_RYP<{6F*bEh>DFRp)B<9AsT9Mg-eY{$eRE61^-*vf`%S3x#c zMfzM5ZkHLdDy+;y7A$;Zm`kk;C?m@ykSP+G@UfK*W#nwKvbTd!XLh;e0d1@?SmFZ5 zxFObX$GE}P+-24Qe9V?1lk6IVI_F0almgU-Djd#=( zS*siqhYHbSU2!WDipbbtO>%gPtz5WwZnUybIJX|MGJIC{BvF}hkkP`V4Tr7D`(&x} zsMKl6r7rKX3R|rCj>Sb*4Jc#PRf3HNqZNy-OvkJuv|-M2YvSiEr(@y}Yy1gOzI%gJ z>Zqgg*NBqGL(73(7GbR&uB(JGvqTd>_KUV#?$;i*tb44Y!;so#WgoVHno|yHJ_W#| zmivh1h*>v)h>UV;jI^f%FHP23xH#8aLA;>d%JF8YRRDEtf+||>rz~r!H6O`4tr2*^ zs^4x+I&4)4ohz{sF2hC`h4~jQvqs>xVwqKfRjybhuf>a?8HO&8TiLsyvI~m9#5KiO z?P6=F>pND#YgYa~h)yUz?0U^|IQ@sLALSG+8#Oy$)iIoz`5upeA>aCPmix zN>F3`kYqJVmRS{XO#|mHN6nDKsDs1V>UsnU8gW4dUG}33lU)SXcD94yV&~BHR`ycs zVp)Ubc&W5T;{{E#73;9mx)LwasNN&iIMs;#v|nZ|j9W{P0=99w-gP|+)c_|x0$s)7 z4587AMO`k%LUziww#}4@{n9#QO~S;b;PXXR-eD{EkZ5!OoUUSP2z$udq99c`PIr8FMW|=T3T+4%wGKMU*$B+pd ztg)yjj3LF)-R4?@z_XjIN)TbLx9gL0wUxaUl4n>RNQMdu+b*?Wu~RtcjacG(>l(a3 zYJ#5YT4asbX<0ihF|4e&sxU{)8Y?fiV1}jE8ob1;FkUJxpNtW>3S*C8w-p*#^QT*m zcddyqc0k67uB(*G6c{N0EEgd3TKLZ@gpXBeIhKLbTSqMOuvLB8Kfoe~4_o;_uW_s& zVmT^Z2dqoPFa_*6a=e-*q*!I*0)HUqVpj`{CF7vij|NW0Qp*I~vkUdfKWvrkwo02| z5It^96`lDa$KqnEtjWp)#M)qG9I&#S+mBlloq6lQgcYuPtWoz`nU7jIP?MMi3qu*s z3JcZ`VO%H&f5V%FaClg_PDZPh(@X}qY&!JdB5T|u){IKaJOSVBFioE?+|=ZY8By5g z^+j862pT?LGu$+X{B2Pq7;5y%oj`bg!3LqPew7ao3HUl<5yKZ~@xxM^kT7>P%7E-} z@%cI;!L4*Q!D#ny_q7M3C=-Q8TVN*>_S}Jm&&_#)-#o(y2P`5nKH=aChFbivCEdu| zly7lC^$I~wfDe%+gclgK0FIy+Ytr& z0`Um6c3Zq1+7^tGs4*V5F|gHU%!Oua#8Vq!C!lPLw8nzcC&F!w=uuIa$k|s&5l2gW zI0J*6t)aPCOYbFS0 zONz~EG^bI~5^fJxZ1zV&{;lCq#pQAE-gw2V>Wa&~zSYot6>WO<)$N_?oXN5(Gbr;&C6SroRo` z(13{{{4ZNCneE$x8}dGC9^c}1D{I!)uUhHz84YXeR(q>!eJj?j^{)4MSFc{Rx~9%s zv&?9OgBh*OE#Pf1-wnZp*S3c+g=lEe2}K`F?g@NS0uH-SpNqnfaJ?@C3#EzP3q8vx zdrH*5HK_GEc`QV9rWxYzOg!l%j#pss1}B9EhbEC;IMa|e0t4dVsYJWuI0MZNqslg@ z1BeJVwQh%KARGtxPOkjQRjXH2FGnll;wgBN&==2F!LcvsWPu>`-9{grJ%U6$&j1=k zqsT|&3a^6`8hq+Xab@fWtsSy6V)cb3g%#1=u^NgS`$IcKR($sWMZvp$H~_(kjMhjP z$49$i*p*Z3q7VHHdm$dd0p>O_=qGmxe8TpB(uvN6E|P5QTJPfOb<5Y{G;YGnd9sdc>sNSd(Vg1-Fw{dYgX5ZVLV*wet)k`mxxme%Jok8v#0LfB6PG0` z*LiB@&-ctPpItuPQ`R1fhk}cmgD^O>1|aH>1X>os;zilq*`BgyPZ`vD5iDOohO#C< zY!U`qpc97U(Xx1G8|YIeRER<%j7fnlW!N5YE;Af~j6ehdln{U#v~V&WZ7gdFG%0a8 zS|pyJ(q+UL06ifl9hT3A!tjLc!_I9#GQ~_o@f?^`G#c=bh_}TIdf*-73-?reD~)aHG?u8KLdtLtAsQRVl9``oiku_)Ftw6 zl*xuzRJPN{+37b?x=_YW|CfXF@27OJtZt`&-A+G3=?C%3>5d0&{a&YZu~ow9&Ug;X zKTqksc;$4*6L$VlxJU*;Z2Q>h)pk05!4ZSlO0v^GXQywZ^bRE1>CJZfO_VM+#yH(M z*0#@nN*7ymcKQyH?g5cUDE&HBzPHQi*eHsCqdkUkia27Ek!1jmY3C_zo|+%-M`1dx zIwi?=_=R8(q|c-D3b?oH)+EbCC|$rJGmO9YrAmkQkW?_Z2YYLBvJ+SOw2%XF6L4X3 zxMv2Qtw6jJt|FYGD_oqScO>F?Hx51~;GNiUAi(yD2(#fY;(G~)T{96D6MjJBuP6MV z#z(uNoL<6V^S};HTslk<=)6t86sO$%Pl3Z4e2U;SSnK3Or(H`O#}TA|a2kdEK|q}H zpiNTRO%N+o+L7C3m%#tg#|znf{ZD~2i?*Tw`#RxOaK$iPUW{+Sbud_z1Mda>5P($L zznBKce5v@@e^CAcaUus!OHxtqr{U*8I`UZ$-tQVt_zN`fE`|IUCK2wYe#IMca{y1J z4}Q@aG`cRI8NW??hH=ff-(8>tG+(^l$X}>xzlIDQbsZ|YgRvG zo{r4z$C)?N{>F_yagsB9m^de`S*g=Ze9u_2eAVUE%YCaBFJ9wa>%%V#czy7i2~+$g zqaz*@F9`fDqtDLai#M@WcnN`Zu0XiG16F@Ru=&L$h!ujQcN9*cS2KQ{kTZAjHZ0%k zI6=J2Z1cCmH-Tu$L{jBfo$P{mL5J1kV(^u#zQHG7FWZ8_4y;f@KY^!Qty15PS(sQv zY4^8*n(&>VZeY9bXE0X9eAt55-Wk4V&8eCZ(R zyuOv3&6mnir}aL;lU5sq@Oj5dm|({OxVV%RJ%qFj}~B@KR$f@8g~Yzz;` zizpM%L$N-G6nu<=pC_E_%lu3j4>9QW;iEpx{{q=(SQ`FV1y}9E&pnhs7Cv0=6~t$| zbwV138#J8l_AL$X6l}xzrG_&fe_sIu>(A}_A>pWxYPU&9gur~(b2{O=eJ;`X`^i4l zY52<&T(!?S1s@CLbGbPFW55fR-3cEI-$;Yw7a%a;1s`E7NBkBZ#8C$NJmWu6_~=*V z@WJpR;mDr=ALhTR@KyQ0Q*eAlGXD)l&O`-2qwrNZZ!7#s3jf~NwrltoBy2pS;SUi06Aj->_&XYYfbgMM7z8et0Jz{56W-E2!!Vp{wRnu|5qA+k6;_dAJXtYR`__!_8d+9 z0I?~G{3^oPKAn(;A(#foFD_tU{U4E0`~3~&tNP!q@G-5E_&?Tg*7J{q>w0F>{8iU; zn1bUJn(a24aFjDu!6zzwwExfHgJG(|zZl{yXN$sD^}j*EQO@fq1i~$8#aokEIX z{7b>HDy+Xr?gV$N9!kF;KOUThKT5&X=guSrSD!lz6?}%G&((x;f8+(9YZbog z&s!CIrXr_PlQV*z$Ga82D(8^KFDE{JlK}(TrxZSHx1VVIdBlHF;j8lBQ1~dT4L%sG z9C>B`;r>#h;mn_);Mk5!soW`qqinU@H3}coI^lz%Nx@OhCX%xyjht?UugdwphJQmy zH;h*_oc%T@W7=Ml^O%MoAp8vtXMHZBrE^`++BEnE1xGz`-4KJ1 zaMVS$!{-z}rg6L6uHYzVJ;}LCk)!(OVTG^Cd0pYF(_5FHuu@EQfi~Ki@Pd%kGrojW4Ic4{12t;ny18Msm(;IP(|MzJlKF*QUWgp9cSsaMZmL zK3uPoF&_$M{~{ltGG4gYP8{}l1hrQsLQ{wTNCOT-^exZYmlH2#~! zpRDlJaiCn|pC|sTH2jTe`2IBf_B8koP0kps2!t+$ulD!bH2y;3e_6w;2tT0VO9=nA zhU4#uV0c`^Hxd4fhPM*_f`(sD_-h(|BjJD3@GinXARMD=eY5c)1cBTAZsHdauJgxh z{3nQCmWIDbL|iGQiWSM_OD z_$aFrJ{b0DIL}KTQ{<@g$=5Z0r;uV8Z!7#u0b~2Tr|@xzV*De8KUKje(76G&Llf1j zoN(O^^Ax;Hk+WTqgL%FQ9}KiCDt^t1Ud05SC;rM`xxy*1`1ujI(sWqx@t)To>G5de z_%l=(s9LbYFZ-SV;Sbsn11{gtD~O2mJQQ)1zg(d5nTxlK@1}9JhSC||NI2(Xd>mDD zjmCeE_!~65iQZ3r8oq<#?HYa!$&YCG$As_J@MpMP8%JsUO5}wrf z?@+nVYWNcJpBFX!Eh_hQ4d?baqv1aw{`(sKO^Q1yo%NJI@&;|K;k>_ik%s4yo>Mja zDUyGQhG&vJYc+fpIy(g3pJjcriFb|0-;0wt2wOD#5b49~YAk1=q#Jl12?OJJ-UtK# z5C!8A(&rwHzl!w7b4M7MkLP$W;Q1m9jJLUDoY#RE4@=nIM`pZ@$~~pYxtiqvRm1U@ z@GXF9dl zCXGLv^x381qbdF+4PQX=@q7^mmVX(^Iilg6r2laZ|1IhNiiW>Jaz4`V?~wld+Z9~y zda{2$URIG*#vP^sYo(xXnp*)Hoed@AubYdG)YhBf?7vd>K#elht^ zw}yX};$PA5qf}phKVUn|Cj6kr|6e5kn1+*CmA)0HJr;GtKnSkJPq$6Ikg)8RT}57(D47D_;nf{p?2S<;Q_MGE)9Q;%H5~o zEo5h&M{|8?`NcS*@p&Jb=f%vwo9y^IjbBIYaz?|q5xo~h;XkJKZqV@e2;ZpT z8>zl68va@GlU*9Vh5Tx-hHoZ)_G>urw?3rdoc{+J{!=QqSHp)B{u>RirglH2;V+Xu zf70;368@HkPp9}lH2k|{w{sePj_met4gVhLDSz-dF^=6u{9L+n`|^AJMH+sP+I_r+ zpP~2^4c|res?cy=cb%i*+};Z{Jd5gEt>G_IJ(pg`?P8J8x)Ud z_{TJU?$B_Svs=S&B!9SF!$**P?$Pi9ia(;^6{P1O4QKh!YxwVo&*xRReV-xwyruCo z2>(#SSxzR^gXL6HyA)~oU#MJWu|#fMQjY=8WPTMW}Q zoZoxrYxr7&QPs8o!fp`9t1`afbETtMSXI+`BdWVe-Ro zX}FjC=Ly1*h9Wx92oQdu@e4@)?=^m>U>nAtHU2dee^24llC#M1vBtOSiH3oI`p{CP zh!+vgcKZvpmq+2#5}M%iIUMHW-VcVk3ZK_r5WkFY=GTzjmMDB|LjL~BH5%V;M-6wA zzwOrW(`3(mntc8q%tIQV+x@u4UpWG`H;gkH{~_uxf7kf@eIr+{%!kRij`UBmXNiUf z$PcGzcs=2B2uE|FefWDb8#R6twRcp*ZzMb4sLA2)<=n3Ed0f3u!w-->zpvq61f4MO zc_h}8zX$fR#{UiV(>FAn<-e=p9b|_gv>?d#TuS!5h;S~KzmHX`@mc;l4Znff(XYwj z?*nbu`23!8tA<}m_PIyHhmwDOTa(YTpJH;o^mF>*@IU2u}7MmBR z;jh>5pHY7aXma>_dpBr&Zm(_)A4h(Er-u7wb&Ur#oZI(*6OQ%8_T}&C9@6+8BtST! z;XJS4^H*%2cG9O$k&jj7?>i2q^GnRfVXXMLnLhH<~fXZepReDu#w zlK;5IXZ@ek@H^0jEiY9u${Uh<^t9 z&gV1^=r}3ftKmF8oYHU}Z-wHJhC1Sh$A9j}jPvuQ3M&eMaejVXtKt0I?9_06E+5cv zo+tEbIL}Ys)Nr2v2t^cqc-}P%6;yDZ?^S9z&ohnk=#F;yIxbve5qWLlyGXFjUk?9} zUd$*LKMGa88GaP0JQ9`>k=hvC9B+o-Z)pkxN8I~2Z^mDBD_4^J5r3!|e$!RO#E;!j z7AVgshwsVaKOtt6hv0`+%HgL-;D=W5H*#bgeyOD#euAYV7>Vs5Il&hAsVw{rp#Lku z15(h`+z(i272W7RolDKaGz0(b0~~UzY((B1xI$iAaC0339v8#BJPz|a#U#RMSb~@g zCE_1dkg^%WD-G{9G!5=hrk>wJ`8!Y9RB_`;jv6x{j(U-s*r}ZV=QOTx0_)Fl++){m zf@yDi@ULO~mIo3U?Z=%Dcq;q3LNddxBjgqBhi$~=v;CF=ma6;{STP8Eu2aVPb2mXk zs{ET~%N)}=BVBdwdcafZzxUSU{HQ+;xw`(>1E$NwoO`HzUY|w`gU)ROELHivR6g4Y z%g0v?z5JU=re4p3m5>18L3&QeSfYH^1B=0XJ^z)9We)UDHE=$@?t?_WS9x8OU&ZiV z=iUn#KL2$8y_NENAWaQif5v_YHz-rj{}AQpbI{D!^W%C}D*K;A!$3Gl3ZwlC;lug4 zT~d{e`HXt;SNtPOcvlP`T<6g9WAo^JA0XrOO8jdWPiPe*bz~y^MV(URzx6grIchWI Ijh_F%0ZdPoC;$Ke literal 35728 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 diff --git a/src/mictcp.c b/src/mictcp.c index c67a1e1..b01a455 100644 --- a/src/mictcp.c +++ b/src/mictcp.c @@ -2,15 +2,28 @@ #include #define NBR_SOCKETS 1024 #define TIMEOUT_DEFAUT 1 -// FONCTIONS +#define WINDOW_SIZE 10 +#define LOSS_ACCEPTABILITY 10 // sur 10 + + +//================================== STRUCTURES ============================= + +typedef struct { + char table[WINDOW_SIZE]; + char last_index; +} circularBuffer; + + typedef struct { mic_tcp_sock socket; mic_tcp_sock_addr dist_addr; char NoSeqLoc; // = -1; char NoSeqDist; // = -1; + circularBuffer buffer; } enhanced_socket; + typedef struct { int socket; @@ -18,6 +31,8 @@ typedef struct }arg_thread; +//================================== VARIABLES GLOBALES ============================= + static int socket_desc = 0; static enhanced_socket tab_sockets[NBR_SOCKETS]; int timeout = TIMEOUT_DEFAUT; @@ -25,6 +40,9 @@ pthread_t attente_ack_tid; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t end_accept_cond = PTHREAD_COND_INITIALIZER; + +//================================== SIGNATURES DES FONCTIONS PRIVEES ============================= + int valid_socket(int socket); int bound_socket(int socket); int same_addr(mic_tcp_sock_addr *addr1, mic_tcp_sock_addr *addr2); @@ -33,6 +51,12 @@ void display_enhanced_socket(enhanced_socket sock, char* prefix); void display_mic_tcp_sock_addr(mic_tcp_sock_addr addr, char* prefix); void * attente_ack(void * arg); void error(char * message, int line); +void addValueCircularBuff(circularBuffer* buffer, char Value ); +int accept_loss(int socket); + +//================================== FONCTIONS DE MICTCP ============================= + + /* * Permet de créer un socket entre l’application et MIC-TCP * Retourne le descripteur du socket ou bien -1 en cas d'erreur @@ -82,7 +106,7 @@ int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) } /* - * Met le socket en état d'acceptation de connexion + * Met le socket en état d'acceptation de connexion et bloque jusqu'a ce que la connexion soit établie * Retourne 0 si succès, -1 si erreur */ int mic_tcp_accept(int socket, mic_tcp_sock_addr *addr) @@ -114,12 +138,7 @@ int mic_tcp_accept(int socket, mic_tcp_sock_addr *addr) int mic_tcp_connect(int socket, mic_tcp_sock_addr addr) { - // if(!bound_socket(socket)){ - // printf("Socket not bound, cannot connect to specified address\n"); - // exit(1); - // } tab_sockets[socket].dist_addr = addr; - // tab_sockets[socket].NoSeqDist = 0; tab_sockets[socket].NoSeqLoc = 0; // create pdu syn mic_tcp_pdu pdu; @@ -132,7 +151,6 @@ int mic_tcp_connect(int socket, mic_tcp_sock_addr addr) pdu.header.fin = 0; - // tab_sockets[socket].NoSeqLoc = 1; pdu.payload.data = NULL; pdu.payload.size = 0; display_enhanced_socket(tab_sockets[socket], "état du socket"); @@ -142,6 +160,7 @@ int mic_tcp_connect(int socket, mic_tcp_sock_addr addr) IP_send(pdu, tab_sockets[socket].dist_addr); tab_sockets[socket].socket.state = SYN_SENT; + while (1) { printf("Socket state : %d, SYN SENT = %d\n",tab_sockets[socket].socket.state,SYN_SENT ); @@ -185,12 +204,17 @@ int mic_tcp_send(int mic_sock, char *mesg, int mesg_size) pdu.payload.data = mesg; pdu.payload.size = mesg_size; - IP_send(pdu, tab_sockets[mic_sock].dist_addr); + int sent_size =IP_send(pdu, tab_sockets[mic_sock].dist_addr); tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc + 1) % 2; + + addValueCircularBuff(&tab_sockets[mic_sock].buffer,0); + if (accept_loss(mic_sock)) + { + return sent_size; + } + tab_sockets[mic_sock].socket.state = WAITING; - int sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr); - while (1) { sleep(timeout); @@ -266,7 +290,7 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre tab_sockets[mic_sock].dist_addr = addr; pdu_r.header.source_port = tab_sockets[mic_sock].socket.addr.port; pdu_r.header.dest_port = tab_sockets[mic_sock].dist_addr.port; - pdu_r.header.seq_num = tab_sockets[mic_sock].NoSeqLoc; // NOSEQLOC INITIALISE ? + pdu_r.header.seq_num = tab_sockets[mic_sock].NoSeqLoc; pdu_r.header.ack_num = tab_sockets[mic_sock].NoSeqDist; pdu_r.header.syn = 1; pdu_r.header.ack = 1; @@ -277,7 +301,6 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre display_mic_tcp_sock_addr(tab_sockets[mic_sock].dist_addr, "à l'adresse:"); IP_send(pdu_r, tab_sockets[mic_sock].dist_addr); - //tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc + 1) % 2; //update n° de séquence local tab_sockets[mic_sock].socket.state = SYN_RECEIVED; @@ -377,9 +400,9 @@ void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) //addr = adre } else if (pdu.header.ack == 1 && tab_sockets[mic_sock].socket.state == WAITING && (tab_sockets[mic_sock].NoSeqLoc != pdu.header.ack_num)) { - // si ACK de bon numéro de séquence passer au n° de seq suivant + // si ACK de bon numéro de séquence printf("PDU ACK de Data recu \n"); - //tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc) + 1 % 2; + addValueCircularBuff(&tab_sockets[mic_sock].buffer,1); // PDU bien reçu tab_sockets[mic_sock].socket.state = ESTABLISHED; } else if (pdu.header.ack ==0 && pdu.header.syn == 0 && pdu.header.fin ==0){ @@ -406,7 +429,11 @@ int mic_tcp_close(int socket) return -1; } -/*---------------------------------------------*/ + + +//================================== CORPS DES FONCTIONS PRIVEES ============================= + + int valid_socket(int socket) { if (socket > socket_desc - 1 || tab_sockets[socket].socket.fd == -1) @@ -501,4 +528,19 @@ void * attente_ack(void * arg) { void error(char * message, int line){ printf("%s at line %d\n",message,line); exit(1); +} + +int accept_loss(int socket){ + int sum = 0; + for(int i = 0; i < WINDOW_SIZE; i++){ // somme de tous les packets reçus + sum += tab_sockets[socket].buffer.table[i]; + } + if(sum < WINDOW_SIZE - LOSS_ACCEPTABILITY){// si le nombre de packets reçus est inférieur au nombre acceptable + return 0; // on accepte pas la perte + } + return 1; +} + +void addValueCircularBuff(circularBuffer* buffer, char Value ){ + buffer->table[buffer->last_index+1%WINDOW_SIZE]=Value; } \ No newline at end of file