From ba1b54933983e7d978cbd7ff0bdde3c4122a93e2 Mon Sep 17 00:00:00 2001 From: Aitbytes <104650408+Aitbytes@users.noreply.github.com> Date: Wed, 5 Apr 2023 21:29:28 +0200 Subject: [PATCH] v2 pas termine --- build/TD2_Rezo.o | Bin 0 -> 1488 bytes build/api/mictcp_core.o | Bin 0 -> 26736 bytes build/apps/client.o | Bin 0 -> 9936 bytes build/apps/gateway.o | Bin 0 -> 28632 bytes build/apps/server.o | Bin 0 -> 10056 bytes build/client | Bin 0 -> 45728 bytes build/gateway | Bin 0 -> 62112 bytes build/mictcp.o | Bin 0 -> 29064 bytes build/server | Bin 0 -> 49784 bytes src/TD2_Rezo.c | 280 ++++++++++++------------- src/api/mictcp_core.c | 4 +- src/mictcp.c | 451 +++++++++++++++++++++++++++++----------- 12 files changed, 471 insertions(+), 264 deletions(-) create mode 100644 build/TD2_Rezo.o create mode 100644 build/api/mictcp_core.o create mode 100644 build/apps/client.o create mode 100644 build/apps/gateway.o create mode 100644 build/apps/server.o create mode 100644 build/client create mode 100644 build/gateway create mode 100644 build/mictcp.o create mode 100644 build/server diff --git a/build/TD2_Rezo.o b/build/TD2_Rezo.o new file mode 100644 index 0000000000000000000000000000000000000000..17f3df6344cf3555499ea93eb2c7c7a8f096b538 GIT binary patch literal 1488 zcmbVLUvJYe5Wg)wCjY$|$gx2_eMZCKbo^nrMw(#SW}Iz*plV zAU+9v0yw9(nz<=Lvt-@f?|whWzPo&Tef(yt(*d_SZ~&{wp#VR&R(?{u3GBcfIC^^$ zjs}BpK>DN`Mun~fA5OX8WzI09CCi2v`+Lz|Ka8efr1WGs6%`7iGpZJXWu+9dQc)#7 z=VB6Rn$Ebwq|%g~NApr@&a^C1h(tWVCfJOs%%yWFFu~3mF~pfHcuaGx>5QlG^TW8v znP&6xp@qgTX({L@DL|Dh{_tvd{GNZ2gaI6lMlZrACut>gwR~69tLmutb+=2pebRfn z#IX+BxbNb=h8t@ESf=j=3vmBynHq1y?>}vvptS?$%tjL$!eGPKg8Ft1qIHA%wr%*0 zbr6vNZf?M@uj9>1616C>qd>5GOPe`Q^9v1RLNx`FDupgjtLb=_3+{ZR0%5W!xIn7F zNg!BZoCKT<8{;SuoRK*%^`)qE+DEe;-o@>#iuZm)Q8HhdaHqBh0ty?^}YoUvoK~v&Wcpev^052DWfd5i?Wl z|0#*phnQZKD} H>+AmlpNfqS literal 0 HcmV?d00001 diff --git a/build/api/mictcp_core.o b/build/api/mictcp_core.o new file mode 100644 index 0000000000000000000000000000000000000000..7453c0c59fd3294a8d8f46e86dd5adef5db63ddd GIT binary patch literal 26736 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 bct5LB=h_c-8mW9ut19t47o;mSCx!kWEojuv literal 0 HcmV?d00001 diff --git a/build/apps/client.o b/build/apps/client.o new file mode 100644 index 0000000000000000000000000000000000000000..c8854f59eaa20563fd3fbaea071e7108caf66686 GIT binary patch literal 9936 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 I3cCJ(0L+wt2mk;8 literal 0 HcmV?d00001 diff --git a/build/apps/gateway.o b/build/apps/gateway.o new file mode 100644 index 0000000000000000000000000000000000000000..65bfeec7bef395c0639a2ccef8bb5a15c38011a0 GIT binary patch literal 28632 zcmcIs3t*JhmHuajKbepxNgzQG1_%Ob0^ub=Kwi-ygoivT_!=gY$)hGS={yjuRBM{n zF`Jcai?xUfYi+gKqOGxq#>$~5BthdvK zv*qoYrY?#7NAcRRH=YF&QK$FTe=ZAhzqgWE693}unvKw7cv7N{7J-!aD%&@mv{2?r zC3E!A&!GIhVM)}9WX{q5#EX6O2wc3KOOA9_AM05_1U|>!}IZ}Q`jtI$5XaJqfV={1ACqStG%RfL!x6e@OV2r z&?f9QZ=&M}lI?r&VtuJj?>O^LpQftO=}x6@=iGw!lg|8aeF+!+^O)rJ z#i7!%_eK0v9=?DBMwo~cdwcL@|f*qK>2IjK3hi6x;otoWJeeBcan*kQ;j_j4!Xpa@p$P{_ft9c z%t731taffulVewx9y>TRQXWclyajao9z0tcdq;wvGR){KgDz_yb3pXtU^Ssq`RT)T zk`7m#i4u?Ef<^>w|LY%YqkRvazuYL#R}-aPiYD(2Uu^wznyS5`1-*xZumANA_PW3I z588yS593kIs_lF5^5t$+L(aU@r>Samx>M=vJG})m(2(GM!3HY9{GB*LQ8f z6$A6Vl6K1AnF$qoTrW_PPlf6()UMVf)(s;llb<*adYN~vcaH!->yN(61)L|+EEi5F zQ{WjUk_epD{qb*qkeYSoK0i&>l;bvQQ>L?{p02;(#M^#sk~gvGC~h%$6RQs=mK+lE zu6owp4^{<3<5Tqhx$b1Xb2U_a>G1&oJPG|aR)E0RwE-TttAXL^6oWDm*Pgc-xOUu*Q3Z$vVBuJ6E5)>KSaWwK)(A zv{`tp4n=~2aATX4VnhoKIr!C$bi+bYG=1`+&^}^*=<>U)0Cc(c-D<1VX24^PgTv6V3 zeR=e%E6QUYP~m#5%~hW9v!cPs`e0QU9c@>Ih~q5eQ1*cS6Zjea?keBe4C#LxOPob%%i4Z(<~IqHdp!=7lX zzoi9oo@gu_2`b5Lesr+a(A*OA#lpS@KTr^qOjDdvydp=uz6~@5L)QBuu{Iyo|2{m| z;v{BSZk)!f96Xt6TVaaA-8akmQb`qDTy9vE!)1WF3~;*~YI1ZrHSB;jE$}Lqb4nH= zr&H~>X=wcLW&%&AAt%(a1QJ{$#iYV1Yl_ETvn5l^Inz&FAlQc0) z5i>L~TM=_LF;@{@P0Uloa!t%v#2QU39I_GgT&IbPi*Ep;NfTbBb(KR)VWU+S7%)Ubso}$Z(unPk7;6^(rvFM>f8^5fFA8UJ9Fr(z&8*MYruJV5OV0T z7%*hGu^hI-{1)3jzy{d@J*RRLw(xW@ZASs$>p33ro#tbl;`|RK-<6)g-f!mpTtnXIq^!)OlbL)8cvZ8Loz&?nds<-5yX(X`cItjq-_jbRZTu zwYeujR=FluE1EZ=@VmgOWDLj~>As9*wRDtAn$lS_R6VC{!%;(hyj}T?;@TUjg~AbLs&c<$ zu%_2pXDMK@Lm33~m^P^UCJ5U03y?Xiq26*Vc8td9$l1L{i(Kru0Lzk1EOvO&GtO== zm#;#LIJ+0>CRaI>g`C~>!?A_upl(*G7a4BUCkH1iETM6dxeM}VBfBHpk&9PM8^P0< z9NS)i*wU?KJ4RvauI>X-2F}CgUEMuV-F}{K-_?CMsucJm)J-X%c?un+e}ysO>fRjF zz+lJVH-XR9eUzjOXDP1}FxpXq5#j3ofPnKDxRGR3ItIS0WNeR(K(#TQOZL^ROmXCD zU5}8A3mJGTN=89#l~Ho7Ozd@r`yasy>b~(YkRz)==ziPspm4|Ulcw6Krbjf@A0cK( z>C(~KQjbMPEBY1X7gzUhiGH0rbcE=)v(fKKyS)#BQg+iKj;d%v8xTDPz3J+{F{bHv z`&!^xY#WkhI8FvQNCHj_)dDt?fKRCW5ZeQ_Q1-~PGO=qOl;yZB+3_{t69sK6fm^Qb z_-$jj<3vx<^g~giXKOD!NJ{*G4AY|nrgy|@z3)uMi>9|zxNtvyoV1-T|H;6y$}oGW zi3iAVZ0iTeaBRp2`x*}40b$YtA0fjWAc4Ok!?ES}Q~7VfaAUBVL%%4-EJvebTbU}U zv9bT0dZ-=8Hf^1nJS=r~UrFRJoV8)}Ydva*;fw}@Ta!zMZBb;?*g%uzSVkki1)3k^ z7@Jp=?aCXLH^@<#SpYMdbBN{2o0)xKc2)KwxV^i|tnBPLzybHBe8|Fznh*?oM35`< z91Ab*B8Mw4J6qRw0Faey2%7D^Q2Vke2hI6nh*s>GN0rO*!l}-?Xup275$;*Ya`hEv#-Z-!(#-ovm zEzNZk8v}uf8)i)RO`lrc(j1C!C~pkKCss{t4h34`^+C-?L|?u-*yZ>FEE91Lp*Q1c zYDG8pW}g@e!oxp29{#X-L1u3Cec^pn5T^BboaBn0< z1xac%azJ3kL(ovYt`B=I;kKAB0DAzs0(7yyPM2YuI;S^Ae5jV@(t81r$9S+ER+f$q zAY8w;9QH8x#JHV(t(~>j9^@QbY!|rK*d>eY(r&xNy=JjJ=%3to+qsw91(WO{jX;U~ zB)iZRTw`au@3IHFM&8wJyHD6dE$0A7gMA)coDFsrTn04QwQ#W;?5sxHeTALVXkXZ9 z=iY?v<-BU=HXgQf+S&9AKr|+Rgt^mbIKa}DYIu~+-=);*%M~j_Jek@y8~L; ztwiPHvIoU?+a-73W9K?2 z7lK8UxPCjBo8fA{%g%nwwq3(+dd_yd?QQ|@fLYuh+F9VBr|gP9*dt>0jGOG?v+UwV z1l{ff=*!|KKVQ=!8ULJC%@X%cJI6Vu$jTDxQ~^lfyJUC?b0dd|*$0=@JF z9I@5T8gE$OId=#`zT_Rd6kNUAwrjxQ?Y4cBodw}-$K89BQy=dyqH;iGhx=~#)povf z+z@+2jqR?nE0KSVJr6H6_Bef6iPhKG^?0eVYxJe$a=WzM98t5 zZ_zT?jfAbiwphgS1)BV@RqgXNho<}DRune4fzcOjf}Q2McmovR3^oI>*m_?m8VsoF zP~xle!=~xVWeXPjmM&X5zZNn)@%q{#;aE5jZhc?%X-uL32I;ks}r2wT9gFRMx*^5M;FQTwtHs|K zwS3pYPQS0-AM+=zp{fVs5zxOS-U=JusQ$`TE2`%$Q9Rr&v}WaWFi3qkUe^+|eBqXQ z^iC9RV0;Bv;C;f^5)QZ3!PYN1VajBvwxD)V_0mceml zTh2{B^?m>=HTqkvP@NC9^PwXUVb?~QV?h;SbUXGn#6z%69}Zdd{*5iojZNS_xV?tp z{%S2>y=c`+O9h>$w+<9RxVPhb7*^LzeN9Vq#OcH8|1V z9Ep{B~KNt(+%>oCY@s-cP_sT*bIUJ8!dPm)d!v%sc z1Y7d0%`F?jrmI&hsJ7t7?T<9}*?$Kl3TG9 zrVyM#)M$q#69~eX@cFFRbt;aO<~|*tQA^Dt{k_k^sY<)>r%Acls7|4Iop zPF62n=(~8qDm{#Qg_P0^+f~Ctg{zw5)Tku$YR9TKO{i?8QW-*kr-B)3ih)4{ZDRbQ zKVjZc^X&Agw*!AL~x5TjP~*+D`4_LSE<oJy`$zjBhT~a1oS$%2h z7NldeRoyO=6P)rd%#QIE9EdtBtxFaxnCTh6x(@EPaoy|k%DAE`zcCr!^-is*oS<>_ zYz9vs7H%lR0|(j)pH%iD29GH!={FC?BJ@lC93lZ zzU^E9>&V>>U{PCuv$P1kslnw`Zw-~HO(8CGEz7{VD0c&utKG6>`H!4jemj+`jmKnp zo6Y5qQMuYRO_qn1ZXPH*Oy&FV%H_^oSp9PobRC}9j;l}1B%`a}U!b5Z*_yp;xbWGp zpX5^B=v@H27~mU+wl(B=qX@UK5q|>}gT$L`qacs?OzIEsI!+?|UG6aY6@NS?A z!4jN!OYb%S*ydb@*E`eTzet1sH4Tp6cJ?R#=`{F(H2Cvr@ZY7uFN3c3*X|$E@E=Ws zA5VjyOoO9|`)fBN4PKlEAC?9ml?ET120t$iJ~<73OB(!wH29n}__8$k)oJix8a$o` zzbOrl_lW-Ne`gx}!8G`;G&n!+!6!y~Q6pCXOzRbe_&$Xfe-+cJW>ocAD;rC@B;)i+ zld53pqt}cT(TQzTfZM6?K?E>(W zsW;bn_3e*^o2|Au>{kXiG~@CX7G0sRT0g7j6{rLVep{v2V-0N)Sj{$AO|ft&+WX@u zt2NjfXxnJ%ubx8wP&nEW47OSHl~Y4749`&ddm~sygjQkg zokRorGp8ht5|f0M2xeB#Ncj0uvPgfUlqB&pBny^puwb{A!nnnR(>}iL{1m8ogoJlYTpuw0H3T6^IU6*bl*4!68wr@aXspZf&P`aB|V)@QfC|BduHK)BTBcLqM%(9=N!3i-zyc!_~y z>~O#E-7zNQFN1^eS!wWU12_G(jBr%Tw9gd=j`qRz0;W2FvwcDWXZyqj-lN4>HxZ8d zoBq1h;5YTT&A?54?i4udbHBh@pN9m_{@O#h)MvkeoBsND12^ser!@G725#E_Gs30) zvrrL8h+}`@^^Zyg0_Xk?7dZEKjKF)e7)yWdrQ^r6|7?TbwEsc_H}zR8aMlMu!otM* zvp!b~ob7)N;dn9ii5s|SfBY5=6JE;T;P~H`2EW(9P5bX8T-txPfn$G1ll}JzocsHN zz`4IK3%mzpVS0mbyqNv{FN5E-|3?OH>hqbvS)VLqf+X!P2fBZ56 z6Y`%62iw0v$e%%W3mN?98T>aJc$tBJHx0hcz{eW=KO$WE@#hAP*$YXZT>@vjJu7hb z<8KAt1F|r^O1QM!I|je$NBpV}6Z?hrIU#V?hacIQpY_Si=q-o+SWLLoXM};9e#B2& zFd;vFfWUtIP{_Z8>~_-NA7$|C&&Rc#as!`}2?QjRUjYZp|B8W^8Mr?U{#64XYw*Vi zmwvy|z|piT}G%O}~F);1i*J*1y25)KUJLWZ)wWywbp@8u(-b4;uIs1OGbV z+}{@R%Z&!V8CTyC{9VL&QF-E(y z47|+1FG+(hH*hl!FDG2aVS|CA-+u@PrdEMJNO8DP;OzGs1>U2@SY3o;zsxw?YVezJ zxWm9reeM%D>+^`fS)bhk=Qun-xYXx&25!coBS&`x`NzY-ISvP=I)Sr&LIP*|#0B1?#aK5HF70!x!EgHOHUl^Hxl`b*&;0^t zeI61x`)d#3QlI?>Zu;xr4cxT>e2x=1_jkC!xxZrs z&i0=~xa{w2gWt6OLIXGTSuAkY=Q4q_K35Bz?SBp7QlGeioA&QEaMS+V(%|hqbvS)VL=vB&Yl`Vb+;NVLyPI9N_4;oL9Y51nrCn{rwWyuy&vVc=y3 zzBvv40|PhX`5wYiA2WV-8aT!eKiB+H;2b~u1kUmEoWOfP7N%DSm+|wa!EfsGCj&S2 zIWBP4=QDw`J_G3G7TcfWc@W`JpJ4_*8uVsAPB3tDJvL3q=k?f3gWvS;B?dmpkbk9t zo9nSB4E#ca|Ftyu|E9t72SH^>*xxcZxL;?b!N(Z589(KO%lN4>aP(I_GC-Ou@Fxhb z75KxN-C8N|9>UiVF8$SN@SE`yGjLO%uM3>@`HsLJrgr~P;2b}95H9t(*TBvA*=yjY z9}gM0>Guq3AD8LGq7YgRsNYWGH$OKJBl93X;!mJrkksFCf-B?rD`rgaOA(bEa3+^1 z8rP7RkRN_UlT0`lVPZMwYSQBORE&Q@?Jl5l#wW1f1^!jyUn%e(6aVD`f0byTz|p3d zTJGeU_zv>R zL4oHI|7!y0_W}PY@I|EO34zmX3qJJL1+3>VqVohEp?0~P`7fpYo$-Rdjr=uD;J=`L z%@_C*(ht9Tz{K+TzH_C(-z53X0_Xk5^#Z?<^lumVPbnVoy9cw~VVbn?y9X1;Kk19< zCjy^M{rZ)_?;x7L7vg?368@6lpGD)B->WizrEb=GPw-zr?Vc3)kBPR)PAumEl2a(~ z<-|Wy;QU?M`2wF!bd|t)KmB5X^LxRS0^dn~@eBMu@(aJWW&M9o{f!I$fkg8@5cA(a z{o?t9@e+#LeL~K0q7MmtF|~U{;E$31#{_;m(M42`+pVB}jS~28$S>yzJV^YL1%4~x z7YY1k!fORyP4cf4_@{&i1U{JLd{yAzBYTDgzK;5Py};cR&o>LaljM9);D4faw+nn3 z;XfBRe?Rekw(o)q|c(x*q@gGv8i3w$cY$w7fjLi~ecl#0-_QOm z@Oy~=uL3_xcm}o4aaBfik-+g!Xk)4r_(ly|{2rF&G*W+S1pjoh&l-W_U*EvgDsV69 zxl!PJpXdEed@5%bSNPK){e6(&h`F@k}KaxK03;8=q{>K9Ul=RG`E6cf>#D^3kCS~W1pcqoZmqx_B*!Q4Hfr}8fo~=JT7h3qbi2UcB>A@ryo6|ezsdTq zCH?Og{7+N6zZ5wBQ5;Oq2z(~Bdr;sD2!CJV6mK63{3W6@D1KSby{c9C7FXaqNIu{H zng3SO^IXCIJMznPfsY`5ufTsp{7VJiPWr4C_%kG@PT;>GdxiymF7@|%fqz2n-Xd_8 zf1AL+LG9ir@DIs8KNEN}>GO!d`Magv0&k-JJ}>a&r04GiehcxxCh)_g&pU);byS_d zOaDyp&m#NeQoOK#=M#Rmz}FF7A@FOdzcUHvcKJJbuE+9skp68#⪻R-~TfI>x6F> z{41#4?E=4@?C=vq9~7~d{P?2auOPep!Qe+${$0TPg8u^2=aj%XuJ}DH>;E?OcND#U zWSsRpk8rdbiss)1@cUWjFCaaug&gH%sP`3tzfApY6gYp+v_arwsXqyUe?a3X0mfo z@bh{pE^v;2elLv0xIe@G-6HrY{H%Kg&VGDU;Oxg|19qU5`AW7V#P(3$Lh$v*Pz}XI03Y_EodV%vivrXVU|34vc zzOTJ5aK6u47152Y@assp#v=OK#JLFk6t^N4+z_)W)K51n>fkT1Rz$*@P^I<3x_G1h znRtcH`|Ii=!S%p~l?j5secK4XLpCw^<1j%GtExkLRz)D(+KNA{tq8$SGb`XHjquY< z{2jZd;kTU?@T1MPApHGUk`ru#Uzy|Yq5m$)15(h3?0*(ImooB?ryO)bPgPd(=?2bO0O4kuJ={8e?AnW%rmWz`%5U(j8!15 zBh>yuQNZH?c`)hUA?mz&euy@l@1XI$Q);vt>=vm*iRUu7Q&N^xxj3t8jhPA8%<=|E~ciWn#@=Q2QUz z{Dc@L$=d>0f9)Tn_Bqb5eRPFve-p`MJ%Lo|{t5aTrg@p*Wc#eg%}{`OS-+GvE-^mM z#P#^v4TYRH`4&=r6T`gZ-2oV?DBNs$slErw%*6d?Y!_rurmWvY^-nS*U1fdT_vz36 zN1Jqo`=}n;e-Ip8pZ(Hb+gN2Cz664_o&1mY+M#gB`WRDk>;nXWug(^Kcc!Vn_CuZe RtG~Hf*La32(pB33{{Yy@Ni6^X literal 0 HcmV?d00001 diff --git a/build/apps/server.o b/build/apps/server.o new file mode 100644 index 0000000000000000000000000000000000000000..5a7784cc694a8af7b692fc93ada700f5e99567b3 GIT binary patch literal 10056 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 literal 0 HcmV?d00001 diff --git a/build/gateway b/build/gateway new file mode 100644 index 0000000000000000000000000000000000000000..1b520c2a017e76c81d3cbd0d3771dc527f98b4e0 GIT binary patch literal 62112 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 NVH}f}^tYb>KLDQ?o0|Xt literal 0 HcmV?d00001 diff --git a/build/server b/build/server new file mode 100644 index 0000000000000000000000000000000000000000..414b5d2df1f3c397f27ebf2dd16aa115b75f66f7 GIT binary patch literal 49784 zcmeHw3w%`7wfC8s>|`bhGZXUWm4O5ZYC?DlN+baWCKw>{sG#UDB$J0GlQ<6^Rw^}8 zJErLctu5`PirQ9MU)1`bA{fL1_S%ZpDpzeq3vH-Yk!qzab-w@Fk27b6jP%~`>-W3A z@8jrX@4fa~Yp=cb+H0S^&N-W#-SuFR)>Nt_q?G7VUE2qV8kK5JQ6@S@Sy@g_ zKN&0VRI2Lr_G(1^Ssj(_K_TKYv`4zxxl(|4wkM{ovfrzo7jV@csf+0PBwe4RQ>jzx zQ>99uq!ap0lYEm?7wYJ8@xPjuOt)OpC8u*FzDlVLx|SRdH~n|oYmjuO=L$Z_>10wk zE|seGt^ghB<)6LOFfW$vr5c9@*>9D~=C$$dZL6nF9^c+n(cTt_tgBczZED5T$(5nb z%86VAl8f3Po0_+9nTBEMBba2z$AYF1m8t&8cgA(+J`iqv?V}@)KlFpWzSS9jbtoRx zCgIRU_;QGOnewIh5sv8pmpPnZbiM5VWrxTO{C5us2MWD;cpEzdP2RP>ws0H*q_96;B!tz$PG3`_FBHe> zh=l#?yzQNh*Xx)96bW!((BHVGIoR2u*Ybwi0%$1Y4>W~4^$J18YanE!=y?c?{b9|& z4*0F%&Okf=8`8QW;SjoxUN>IvZEU^X+w5y=Cun1c+$0A3;F;;9ktTg71la@?GRdP@rPSGL*doy1HKNw)=2&E0v2vVDb()w zccJCRbv|!%Tfo=eb|Z}eNi4^p!`BwjnuC77Hm|;J)@<*@%88Xz^!y}va|NF;SG1kyEraJp9sMOwZAFa*Ir>qVaw1P9x=j2(v39snjtptD(aQZC z?2axIXug1y)|M*#g2hzNv|pm0U;^J_z)#cuF7c6Q-`Mg^EE87k4T+!E)`mNi4DGlq ze~Z_rYab@?Gwb}+eTuq2I4bW0cggz@1>Y{=)-Gx_em|kgM>++Z)+~PCC5qZn1Kc=| z`wj4XiA%{z1AMpve%b(6Yavzl2Lw_E5_D0&P8#59EU5Cd0ZwbLeo6ksN8N)^oz(!R zzNyP;fD?_niVSe2JF0UT;22>2DmTD0btr7X0H-xqUDFKkYz0JGV}Pq$Q>ykD;C2Ik zg8}X^z?U1~WPj>fWq{`>AktO?Jl6p4GQg$j@Y;0-c!2?bqXAxMfPd8hFEYS48{owT z_*MgahylLc03T|A?=ZmC-h--l8sH-g_`3}75(B)?0CySShYawM2KZqEe3SuxK6_pR z|4I$~*)ig8p6>Upo*wp}Ubu%%ePMI#u&4WZ>weyBY|3NTYTBvT=${~QlxT$CN;RiW zyc3JXHuEw$+EXW9*30BzPo3DOm&vi7I`Lz@Ob+$biF@@jEfA+pY|+c)SWlh!vR)>K zdg{atdYK&QsS`fEOb+zai7WInInGljYV|TX%u^>O=w))0r%sI2%j6(WoygJ4MuD$^j|NN14RGzGA(TAzg{Lsi2mzka)9W+UZw>P{nyLn2+@DNOb!tJ z*URMi(0{#54iEj;%jD?Lf4xi&4*l25dQ zCz8q!CzZdSRQ_&K`L3jLZ&Gcx#Qu)`$@`OLtMPI(w6Mfgyee7hz z()wO@0Jl`0-a(6aQoRZDCzk&hNIu@|>8*YT8BZ^JgOcf|!})L>U#C1=hb?y0QL+)% zr0tg}@PEwlr~HVLai4jjCq4TbWTN*Zm_F>uk~e#n{`5bK84_h}Lrq!_ zYs6pRM>2PTdF(_v5Dv1ZK}pWAd&7$+$2XqqVGjcUEXQ4aBM;x&=eU)&ot}eiFo@}b z8nck~L|HbHy#iG2LB9Vd=#{6}ee`K^Hlikauzvxd%?I5_&DyhnpA3lxQ90^<_gNzC zFF`5lKGwqy3<1;L1%lWU{Us>x=XI}kZ+JBpaU5h$2*w4U4oM7c^j3cdwEf4=P&@2v z$fKz<)YN?hin0xyb@hwm0QwLhPt<+H)8jtUQ%#b>FkYx8B4xHi}E1{1VN{G#qxd)SN1sTZcmXd3cJ2`0@muqsb)z7LC- z8qh0AgjfC+i}kQ=!1welINju#l+Eog%=)LHp%?ZW47AD6boT^1JWO(#3HH7gzy~_^Q?jjL9(U+g5 zC3Y`OGT?3fYb>^@Z(RiuHXiO_J2>`+XK03adLoDFqJOQ69{MSe3Hv&5jk^1~H}t_a zdjW$uJ1}I2o~GLXOeSiY(O|m!dK*5X+Gqm|-c1sUDR9Ws>v0IO8mFZA6@>6~Z`iJd zr=ey$EF?OH*g1KLrVGXcINg1wC~07Ov;j9|?j4S&I7V}{A-lVykGLKp)TYy10Ekbf zG+CL_p8!r6IA@Q$oU83LSpiqudXj|f16CmV)Ej}62m7l~0d&y^7rK1X)4k6@^Emoa ze=bpx-SjLwozQ~IXskzJAN?>M7*o_8Z!%prNiuLJaa3vuX2|vV1mqr&dzF#rhbE z@*>zp-Di5-XU?IN{vd?nI_ZzPKXyFDzPA)h`cr*>c3gnpReh%%&Ozfx<37xB?Y?G5 z`5~0qSYBSSum1;siN#JiF6!egoxaq4=1Y}E>0Zw>NcRQ`O1ere-N)}`!(WamgTLGW zMm_G2&mrqU_s66F5LJU&{|<0@FW1vMWjsm%?jT?zIC*+lJ%OmG2H2VjAq5y!zqzv!&LatKg}7zFnTaoz^Q;}c>$K@=~-Ol!Ss5M44GU?AHm&zK)vysLl}59PGd36K-0kDPM{Fxx4?Y3!U#@Ol;!4!E_{*^BHt8ucBEB zu9#uMPRN;%jA)g2>>X;jxB72`A(LOpbg+hu2;%1tQN7^agJtm|ddxk-X-{__`oul~ zF?c*lJboRvhB#h!J^3X|hL#;n+iTo8oK6@1Uwg%(}-MfB)jaQF*7x(wO zMAudlR@8k|fYEe4;m-v=yk#FI+F^cEB)j+q=5^E!M_N6R&`N;Tz2TWycr<2SAGC2O z7U_>gj>aNKVi8PUz6Q<2-6Snh?`;DaBeMQK!@j<**1za!EWu|SPr1+FZsX=FG;Q-W z#AmvH;gVXSUJqs|Q+@~B*9Y%5zld3j)lHYwiIa1Shk-qysMjHl&3E&VK zi4@CHLZhxE#gfB;Uley;bzluI)NfeaqK7=6{?W7VZy6rs_MM*T8Arx)6iZyqEQjVX z9ZvR2Q@|rWoY4(uqUe?T%%$$rH#4N~SzuWPiN5^43w!9Zgkqn$(4pw2ll;DB(-|bM zq&-WkVE;Av8{O0oNcSH48;cY`{l5i%f7_{8Y!@M&poe6Do+juLKs`OZ#LCli*J&g@ zoE#&MiS#Nk>F$@9d_?GFI+Ndk6QEfm0ksp8-n%s1Eh%d92+y12)Ew{kA1M*;5!4k# zeHc(r?A1JBe`2@X-llBs+XqYn)vfB|ph;oV^ z{+C-yJ*b3H{5;;OxP@J%S3QcV_wK-0C)~cR2Q)r**k8D!8{UT?bvoTz&a!$M+_`9@ z8GvUgO40w&Nl3_^TnN#zFyfBL)JNvA?`RtC5S}G4O5}yu9VqlRn4a!q17HH8$CdzWt;G8oUA_9nv80q`XZ| z(3TT(7Wc;|L2v~Kgfec13IJGDssI51gmxbPKxyZ8+_+%bYe*^Ho_emC?$a5O3sWL( z1rqv+O^0ZEAQ`dmeJg21`!J%1dfaaftm{Q!3SIX>*SP77>v{lm()Bc;A4oGp(J2rt zKyW;jW`={u0+RyigUfZKcT*z$f{>m}GduR;p6Hm|3mtI3Z#v-qlXk%U0XEt0lhB2B z(0!Vcl#Et_5ym>j*gt^CSpPDZFO7XH0*7}}tY{e3ZB#c1gGY-QG}MRXj=Pd?qe71V zpJFkrNH1bV;x#+;8b4|VlxZLIcw|1QeW?j|Npnojgl5GO`ZDOay1SRuZNSg<>#m z`nVOoc(xT1pFMR_<}}B#F1cdDUenY z(f|erW0M9)^8~jfWCif01M#7;J>xmY*nUDjgT{6s4y2A(z(Gnv%faD&r%U$rmzbXG ze%Cbax#;2OzLb<(LHX5ebISUqsMmev0D2(#XPis^DN_EZ`>h`K*gS5Y^DtT|Tm3C? z;wG7**`ERFbEm{!_)}6FntkuKlx+o7TV#^gz<4*qdJ_ziuieqeQL)f{rC3en$4~GX z_I-T@-w%LrlHIRNqNPWDa#LZicaevIcxiKCD%7=-vIa9c)gYLJ;8@`v; z?S9MD!)DIawCV1*He8T$4qpKb$5VM`c(K9F)1QkR>|vRLC_;P6tBCnHh~;?FJ#2=_ zvFQWc*`;Lmv0ILGx?|JNfCvT`5rh6ee2y1+7DO;g-2M&BnC=N40M375ow^C=aj%eK z8ET0my?fAojBb-scC3bQm2>Eq%Mg~L57hFbR-=?0j?bYU)SJoWo3WG4cNGB;eF=A< z{a0ecG$0|($A>uK=d2aq$J`VCBt=JW0f%$=lN6L5P;!5gM@}aNQkgU+HCuxUENxkzXB_tdhx-o8=PYMYAQ^o}JX|WL*)23f;X6KmIh(55(wDOn z4o0eT4=2m-!fHgbfTH|O$fs1u2eYKiX2+&Wfrwr&!vnwmcVS~GiGB(q%z`vN3qDWX zPXLjRNeXpuMEyB!|N1!6IcXhW_Q`}#)FzIP;Vw(K!FS0yVtk;f8F*CM zzw38+;Bu!Wu6sN$;ku`BaD1NbgJ_D|OPXWT@1aX@%pi`<;FwbP3qW*El}(Eyol|8w zg!{jxvL|cKp|VFYYq&|bn}wQSmYcp|Lhl#krR?ZBaFudR-{;umC-hX)x*WJllQVz_ zO&-B6vwzsTpQA|&HE_=R|Cu_{IW>8Za0k?6O2NM&Nhr>q+G_=Xm1-K1%}znR(Wjhc zvz5P>Hrunzg{7%nx|&f!j~VQw?~4PQlWeY`U?lAz%-Gf6;B~eO!Nfdql%Gzh>MGi!pBnC2lC4YFk{W*DMq@gH??~ zubGUR9(Nw+_dkFySG#47#{;%DCS-+*RmpLfy?s~z2-L5V1UciFve**1WkF5 zyNc7qYnBL_$%^KtY}L+ms(I2qjbc6YO2N1Ec1lFebXBueuVK_qZ}pe#&|maTXd4Qo zpsjf41JB%_2QY4}OE3g*(SPN^&i$S!9_2)@=|^nr2?Q6*c($8k@McYbQ*+xUvfWO_23hFI}=|_T|^Oz~3JU zx_qv7pR19+r6j4)De+08OZ0f8rYZc{scxN?g|l5y*UrZMJD?nR2Zq+ z#_I!}Yuo)zEgdl4gep?v+;(3J5Mh3#l6Yxuow2S#j?of)TP&~@WDe8-2sala%mw$h za9KTGcF?qQcNcx6uc}>h+b|o@yT)K!SGbdU0Kw|!)VsCW^^2Cc=V%bwyTrY4DbFl+ z&vw^+0Z{jnrM0u_>y~(sC&api^U$5y?uMn5yRx>9r?QQPU}w0qv9sN^1e1k&!&S_i zKYIp98dYIXcGBF4PnvpKMOfV=C5M08l>Mvx(aCw=|-eWUya4KBh`KldV(W8 ziuAy1ptpeE>#^7{q>mt-f%H?PE0LCB+kX?%yO3@}`UKKGq*uHFdZdMjD`@JJPEWbnZi1gjXewBK0AqkFxubx{xl%+aondZ^bk8 zRY=qE4%bGc>yYk1+K==kQo0bh<(KKk#hPiI(=;?Y!%8|M_%Qr-LU-c{V@?KQYtR*b zlkwYi5IlgV*`0IkMe`k5Ypol#nL{qQU{cvAKso(Nq#H37oREOHh;JCbb%2xZ)kST6 z4Zm?O#$xx9j@@?WSIn~qrCYX|ArhD6A%K7M%UJ9Vq5$dPFR#MT|qkb*wmnG2G>-6oYe+c!| zk9hm{>-Aql{WREMETR4{di_JFFN7@~OsL<>>x%$;5%qgfPkPY#BTKsNM_mB+OL@I+ z2`AG1HSf`7d=d2y%(==0`q4W5`=}p|x%a&U z`hVByvoRO%Mg5(?)A?I&*X{2j)aPNYZb_*Bs$O4@`b`Mk?o8nSfX=@i_4$Zp-wk_> z^S{eV2)zHOzZ1`y_9W0huG2q+`YJpKOf^O?qJ9PHZ%d&6l1~3V>ibaNl~CWJ*Js0* zIPq-uq6Gbw>iW9~^~3O*%qv=u-g?iL~3D4fIGxB$LTg)qY69m=f;1>qoA>jE5 zFxT$3v+RJCzU9;>(v+T}U zc;lCR$}`||5`3g9BW~xf^BOp>f%6(TuYvO#IIn^88aS_k^BOp>f%6(TuYvO#IIn^K zff_hU0YO~bWlEt1x{}i`2(S+SyDVqRlm`TmA0*5D7mEzON8y(`2Xm+_QwWAG`ed9g zbsi>(S^6u6D~=n z9S#UEg_h_#EHhFqIPp_l_@07ahh;+w?v!OEcb~+=7fk$8?T?UUh4=TE=pV%8pwDEv zOA;a)$@{P5MCh28N6C5|7?4me+5aC))H&(N469^NSscHhX$`WxN~T>h-6+$|GTkoI zoigo{>0y~3mFY>DYIGJHE~iXgGOdznjZ7P4x=N;9GTkWC%`)9C)15Nylj&iZ9+l}y znGSe3vJmNW|EhCaF@7;J#d))5U*alXwmK3BM_kh@Cs$TgOo;H(gfC6R1NO<46UGU+ zMj>8deZojiNE>`!*>+OH0{<>3OyECUA`o~OHwl-D0zVty$OwG;uAZ(EKnA+DfHNX} zxU8l+%)e|OjQ&y>E` z%5Ak^opvcNRN3fpTG|X=m}a9#KWWvxP-AmI$7waZ;IZWsw_09ku$56evv^^-trSA1 z%_;aMRZ8!}@ zOIzr;5`|lAvxwUw>wVzXZQDmRS2!L+;j1=!c9gba&<-GMwmn6Ks|)v_W~(hog03t+ zgu-^)Tq<0{#o1vaq0+9k%>&I&+s)JkZ)ODwyKMhPHLJL6eYX3kX0`Q~fIY97d!Q?p zQT!L+WplL$b*TvWcn$KZll{ha| MJSK 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 literal 0 HcmV?d00001 diff --git a/src/TD2_Rezo.c b/src/TD2_Rezo.c index 7a19cd2..bc50480 100644 --- a/src/TD2_Rezo.c +++ b/src/TD2_Rezo.c @@ -1,113 +1,113 @@ -/* - * Permet de créer un socket entre l’application et MIC-TCP - * Retourne le descripteur du socket ou bien -1 en cas d'erreur - */ -int mic_tcp_socket(start_mode sm) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +// /* +// * Permet de créer un socket entre l’application et MIC-TCP +// * Retourne le descripteur du socket ou bien -1 en cas d'erreur +// */ +// int mic_tcp_socket(start_mode sm) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); - result = initialize_components(sm); /* Appel obligatoire */ - return -1; } -/* - * Permet d’attribuer une adresse à un socket. - * Retourne 0 si succès, et -1 en cas d’échec - */ -int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - return -1; } -/* - * Met le socket en état d'acceptation de connexion - * Retourne 0 si succès, -1 si erreur - */ -int mic_tcp_accept(int socket, mic_tcp_sock_addr* addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - return -1; } -/* - * Permet de réclamer l’établissement d’une connexion - * Retourne 0 si la connexion est établie, et -1 en cas d’échec - */ -int mic_tcp_connect (int socket, mic_tcp_sock_addr addr) { -printf("[MIC-TCP] Appel de la fonction: "); -printf(__FUNCTION__); printf("\n"); -return -1; } -/* - * Permet de réclamer l’envoi d’une donnée applicative - * Retourne la taille des données envoyées, et -1 en cas d'erreur - */ -int mic_tcp_send (int mic_sock, char* mesg, int mesg_size) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +// result = initialize_components(sm); /* Appel obligatoire */ +// return -1; } +// /* +// * Permet d’attribuer une adresse à un socket. +// * Retourne 0 si succès, et -1 en cas d’échec +// */ +// int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); +// return -1; } +// /* +// * Met le socket en état d'acceptation de connexion +// * Retourne 0 si succès, -1 si erreur +// */ +// int mic_tcp_accept(int socket, mic_tcp_sock_addr* addr) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); +// return -1; } +// /* +// * Permet de réclamer l’établissement d’une connexion +// * Retourne 0 si la connexion est établie, et -1 en cas d’échec +// */ +// int mic_tcp_connect (int socket, mic_tcp_sock_addr addr) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); +// return -1; } +// /* +// * Permet de réclamer l’envoi d’une donnée applicative +// * Retourne la taille des données envoyées, et -1 en cas d'erreur +// */ +// int mic_tcp_send (int mic_sock, char* mesg, int mesg_size) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); - int sent_size= -1; - mic_tcp_PDU pdu; - pdu.header = ... - pdu.payload.data = mesg; - pdu.payload.size = mesg_size; +// int sent_size= -1; +// mic_tcp_PDU pdu; +// pdu.header = ... +// pdu.payload.data = mesg; +// pdu.payload.size = mesg_size; - //IP_recv quand fiabilité implémentée +// //IP_recv quand fiabilité implémentée - sent_size = IP_send(pdu, sock_addr) - return sent_size; -} +// sent_size = IP_send(pdu, sock_addr) +// return sent_size; +// } -/* - * Permet à l’application réceptrice de réclamer la récupération d’une donnée - * stockée dans les buffers de réception du socket - * Retourne le nombre d’octets lu ou bien -1 en cas d’erreur - * NB : cette fonction fait appel à la fonction app_buffer_get() - */ -int mic_tcp_recv (int socket, char* mesg, int max_mesg_size) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +// /* +// * Permet à l’application réceptrice de réclamer la récupération d’une donnée +// * stockée dans les buffers de réception du socket +// * Retourne le nombre d’octets lu ou bien -1 en cas d’erreur +// * NB : cette fonction fait appel à la fonction app_buffer_get() +// */ +// int mic_tcp_recv (int socket, char* mesg, int max_mesg_size) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); - int delivered_size = -1; - mic_tcp_payload *payload; - payload.data = mesg; - payload.size = max_mesg_size; - app_buffer_get(payload); +// int delivered_size = -1; +// mic_tcp_payload *payload; +// payload.data = mesg; +// payload.size = max_mesg_size; +// app_buffer_get(payload); - return delivered_size; +// return delivered_size; -} -/* - * Permet de traiter un PDU MIC-TCP reçu (mise à jour des numéros de séquence - * et d'acquittement, etc.) puis d'insérer les données utiles du PDU dans - * le buffer de réception du socket. Cette fonction utilise la fonction - * app_buffer_put(). Elle est appelée par initialize_components() - */ -void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +// } +// /* +// * Permet de traiter un PDU MIC-TCP reçu (mise à jour des numéros de séquence +// * et d'acquittement, etc.) puis d'insérer les données utiles du PDU dans +// * le buffer de réception du socket. Cette fonction utilise la fonction +// * app_buffer_put(). Elle est appelée par initialize_components() +// */ +// void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) { +// printf("[MIC-TCP] Appel de la fonction: "); +// printf(__FUNCTION__); printf("\n"); - //éventuellement trouver les bons socket, buffer et app - app_buffer_put(PDU.body); +// //éventuellement trouver les bons socket, buffer et app +// app_buffer_put(PDU.body); - /* Utile quand on fera du reliable - if(SeqPDU = SeqDist){ //packet valide - SendAck(SeqDist); - SeqDist++; - IP_send(ack); - } - */ +// /* Utile quand on fera du reliable +// if(SeqPDU = SeqDist){ //packet valide +// SendAck(SeqDist); +// SeqDist++; +// IP_send(ack); +// } +// */ -} -/* - * Permet de réclamer la destruction d’un socket. - * Engendre la fermeture de la connexion suivant le modèle de TCP. - * Retourne 0 si tout se passe bien et -1 en cas d'erreur - */ -int mic_tcp_close (int socket) { - printf("[MIC-TCP] Appel de la fonction : "); printf(__FUNCTION__); printf("\n"); - return -1; } +// } +// /* +// * Permet de réclamer la destruction d’un socket. +// * Engendre la fermeture de la connexion suivant le modèle de TCP. +// * Retourne 0 si tout se passe bien et -1 en cas d'erreur +// */ +// int mic_tcp_close (int socket) { +// printf("[MIC-TCP] Appel de la fonction : "); printf(__FUNCTION__); printf("\n"); +// return -1; } -// STRUCTURES +// // STRUCTURES @@ -115,50 +115,50 @@ int mic_tcp_close (int socket) { -/* États du protocole ( noms des états donnés à titre indicatif => peuvent être modifiés) */ -typedef enum protocol_state { -IDLE, CONNECTED, ... -} protocol_state; -/* Mode de démarrage du protocole. NB : nécessaire à l’usage de la fonction initialize_components() */ -typedef enum start_mode { CLIENT, SERVER } start_mode; -/* Structure d’une adresse de socket */ -typedef struct mic_tcp_sock_addr { - char *ip_addr; // @ IP : à fournir sous forme décimale pointée : ex = “192.168.1.2” - int ip_addr_size; // taille de l’adresse - unsigned short port; // numéro de port -} mic_tcp_sock_addr; -/* - * Structure d'un socket - */ -typedef struct mic_tcp_sock { - int fd; /* descripteur du socket */ - protocol_state state; /* état du protocole */ - mic_tcp_sock_addr addr; /* adresse du socket */ -} mic_tcp_sock; -/* - * Structure d'un PDU MIC-TCP - */ -typedef struct mic_tcp_pdu { - mic_tcp_header header ; /* entête du PDU */ - mic_tcp_payload payload; /* charge utile du PDU */ -} mic_tcp_pdu; -/* - * Structure de l'entête d'un PDU MIC-TCP - */ -typedef struct mic_tcp_header -{ - unsigned short source_port; /* numéro de port source */ - unsigned short dest_port; /* numéro de port de destination */ - unsigned int seq_num; /* numéro de séquence */ - unsigned int ack_num; /* numéro d'acquittement */ - unsigned char syn; /* flag SYN (valeur 1 si activé et 0 si non) */ - unsigned char ack; /* flag ACK (valeur 1 si activé et 0 si non) */ - unsigned char fin; /* flag FIN (valeur 1 si activé et 0 si non) */ -} mic_tcp_header; -/* - * Structure des données utiles d’un PDU MIC-TCP - */ -typedef struct mic_tcp_payload { - char* data; /* données applicatives */ - int size; /* taille des données */ -} mic_tcp_payload; +// /* États du protocole ( noms des états donnés à titre indicatif => peuvent être modifiés) */ +// typedef enum protocol_state { +// IDLE, CONNECTED, ... +// } protocol_state; +// /* Mode de démarrage du protocole. NB : nécessaire à l’usage de la fonction initialize_components() */ +// typedef enum start_mode { CLIENT, SERVER } start_mode; +// /* Structure d’une adresse de socket */ +// typedef struct mic_tcp_sock_addr { +// char *ip_addr; // @ IP : à fournir sous forme décimale pointée : ex = “192.168.1.2” +// int ip_addr_size; // taille de l’adresse +// unsigned short port; // numéro de port +// } mic_tcp_sock_addr; +// /* +// * Structure d'un socket +// */ +// typedef struct mic_tcp_sock { +// int fd; /* descripteur du socket */ +// protocol_state state; /* état du protocole */ +// mic_tcp_sock_addr addr; /* adresse du socket */ +// } mic_tcp_sock; +// /* +// * Structure d'un PDU MIC-TCP +// */ +// typedef struct mic_tcp_pdu { +// mic_tcp_header header ; /* entête du PDU */ +// mic_tcp_payload payload; /* charge utile du PDU */ +// } mic_tcp_pdu; +// /* +// * Structure de l'entête d'un PDU MIC-TCP +// */ +// typedef struct mic_tcp_header +// { +// unsigned short source_port; /* numéro de port source */ +// unsigned short dest_port; /* numéro de port de destination */ +// unsigned int seq_num; /* numéro de séquence */ +// unsigned int ack_num; /* numéro d'acquittement */ +// unsigned char syn; /* flag SYN (valeur 1 si activé et 0 si non) */ +// unsigned char ack; /* flag ACK (valeur 1 si activé et 0 si non) */ +// unsigned char fin; /* flag FIN (valeur 1 si activé et 0 si non) */ +// } mic_tcp_header; +// /* +// * Structure des données utiles d’un PDU MIC-TCP +// */ +// typedef struct mic_tcp_payload { +// char* data; /* données applicatives */ +// int size; /* taille des données */ +// } mic_tcp_payload; diff --git a/src/api/mictcp_core.c b/src/api/mictcp_core.c index 0a1136d..b55f36f 100644 --- a/src/api/mictcp_core.c +++ b/src/api/mictcp_core.c @@ -302,9 +302,11 @@ void* listening(void* arg) while(1) - { + { pdu_tmp.payload.size = payload_size; + printf("je vais recv\n"); recv_size = IP_recv(&pdu_tmp, &remote, 0); + printf("j'ai recv\n"); if(recv_size != -1) { diff --git a/src/mictcp.c b/src/mictcp.c index 05c55ee..7c3ba33 100644 --- a/src/mictcp.c +++ b/src/mictcp.c @@ -1,226 +1,431 @@ #include #include #define NBR_SOCKETS 1024 - +#define TIMEOUT_DEFAUT 1 // FONCTIONS - +typedef struct +{ + mic_tcp_sock socket; + mic_tcp_sock_addr dist_addr; + char NoSeqLoc; // = -1; + char NoSeqDist; // = -1; +} enhanced_socket; static int socket_desc = 0; -static mic_tcp_sock tab_sockets[NBR_SOCKETS]; +static enhanced_socket tab_sockets[NBR_SOCKETS]; +int timeout = TIMEOUT_DEFAUT; int valid_socket(int socket); int bound_socket(int socket); - - - +int same_addr(mic_tcp_sock_addr *addr1, mic_tcp_sock_addr *addr2); +void display_mic_tcp_pdu(mic_tcp_pdu pdu, char* prefix); +void display_enhanced_socket(enhanced_socket sock, char* prefix); +void display_mic_tcp_sock_addr(mic_tcp_sock_addr addr, char* prefix); /* * Permet de créer un socket entre l’application et MIC-TCP * Retourne le descripteur du socket ou bien -1 en cas d'erreur */ -int mic_tcp_socket(start_mode sm) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - mic_tcp_sock *socket = &tab_sockets[socket_desc]; - - - socket->fd = socket_desc++; - socket->state = IDLE; - //not bound yet +int mic_tcp_socket(start_mode sm) +{ + printf("[MIC-TCP] Appel de la fonction: "); + printf(__FUNCTION__); + printf("\n"); + enhanced_socket *socket = &tab_sockets[socket_desc]; - int result = initialize_components(sm); /* Appel obligatoire */ - if (result<0){ - return -1; - } - - return socket->fd; + socket->socket.fd = socket_desc++; + socket->socket.state = IDLE; + // not bound yet + display_enhanced_socket(*socket, "état du socket"); + int result = initialize_components(sm); /* Appel obligatoire */ + if (result < 0) + { + return -1; + } + + return socket->socket.fd; } - /* * Permet d’attribuer une adresse à un socket. * Retourne 0 si succès, et -1 en cas d’échec */ -int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +int mic_tcp_bind(int socket, mic_tcp_sock_addr addr) +{ + printf("[MIC-TCP] Appel de la fonction: "); + printf(__FUNCTION__); + printf("\n"); + + if (valid_socket(socket) && tab_sockets[socket].socket.state == IDLE) + { + tab_sockets[socket].socket.addr = addr; + tab_sockets[socket].socket.state = WAITING; + display_enhanced_socket(tab_sockets[socket],""); - - if(valid_socket(socket) && tab_sockets[socket].state ==IDLE){ - tab_sockets[socket].addr = addr; - tab_sockets[socket].state = BOUND; - return 0; } - - return -1; - } + return -1; +} /* * Met le socket en état d'acceptation de connexion * Retourne 0 si succès, -1 si erreur */ -int mic_tcp_accept(int socket, mic_tcp_sock_addr* addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); +int mic_tcp_accept(int socket, mic_tcp_sock_addr *addr) +{ + printf("[MIC-TCP] Appel de la fonction: "); + printf(__FUNCTION__); + printf("\n"); - if(valid_socket(socket) && tab_sockets[socket].state == BOUND){ - tab_sockets[socket].state = ACCEPTING; + if (valid_socket(socket) && tab_sockets[socket].socket.state == WAITING) + { + tab_sockets[socket].socket.state = ACCEPTING; return 0; } - return -1; + return -1; } - /* * Permet de réclamer l’établissement d’une connexion * Retourne 0 si la connexion est établie, et -1 en cas d’échec */ -int mic_tcp_connect (int socket, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - if(valid_socket(socket) && tab_sockets[socket].state == IDLE){ - printf("%d\n", socket); - tab_sockets[socket].addr = addr; - tab_sockets[socket].state = ESTABLISHED; - return 0; +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; + pdu.header.source_port = tab_sockets[socket].socket.addr.port; + pdu.header.dest_port = tab_sockets[socket].dist_addr.port; + pdu.header.seq_num = tab_sockets[socket].NoSeqLoc; + pdu.header.ack_num = -1; + pdu.header.syn = 1; + pdu.header.ack = 0; + pdu.header.fin = 0; + + + pdu.payload.data = NULL; + pdu.payload.size = 0; + display_enhanced_socket(tab_sockets[socket], "état du socket"); + display_mic_tcp_pdu(pdu, "envoi du pdu :"); + printf("À l'adresse :\n Remote Address IP: %.*s\n", addr.ip_addr_size, addr.ip_addr); + printf("Remote Address Port: %hu\n", addr.port); + + IP_send(pdu, tab_sockets[socket].dist_addr); + while (1) + { + sleep(timeout); + printf("timeout\n"); + if (tab_sockets[socket].socket.state == WAITING) + { + IP_send(pdu, tab_sockets[socket].dist_addr); + } + else if (tab_sockets[socket].socket.state == ESTABLISHED) + { + break; + } } - - return -1; + return 0; } - /* - * Permet de réclamer l’envoi d’une donnée applicative - * Retourne la taille des données envoyées, et -1 en cas d'erreur - */ + * Permet de réclamer l’NULL +*/ +int mic_tcp_send(int mic_sock, char *mesg, int mesg_size) +{ -int mic_tcp_send (int mic_sock, char* mesg, int mesg_size) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - mic_tcp_sock socket=tab_sockets[mic_sock]; - mic_tcp_header header; - - // printf("%d\n", mic_sock); - if (socket.state!=ESTABLISHED){ - printf("connection not established\n"); - return -1; + if (tab_sockets[mic_sock].socket.state != ESTABLISHED) + { + printf("non non non, t’es pas connecté \n"); + exit(1); } - - header.dest_port=socket.addr.port; - - int sent_size = -1; + // create pdu mic_tcp_pdu pdu; - pdu.header = header; + pdu.header.source_port = tab_sockets[mic_sock].socket.addr.port; + pdu.header.dest_port = tab_sockets[mic_sock].dist_addr.port; + pdu.header.seq_num = tab_sockets[mic_sock].NoSeqLoc; + pdu.header.ack_num = -1; + pdu.header.syn = 0; + pdu.header.ack = 0; + pdu.header.fin = 0; + pdu.payload.data = mesg; pdu.payload.size = mesg_size; - - //IP_recv quand fiabilité implémentée - - sent_size = IP_send(pdu, socket.addr) ; + + IP_send(pdu, tab_sockets[mic_sock].dist_addr); + tab_sockets[mic_sock].NoSeqLoc = (tab_sockets[mic_sock].NoSeqLoc + 1) % 2; + + tab_sockets[mic_sock].socket.state = SYN_SENT; + int sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr); + + while (1) + { + sleep(timeout); + if (tab_sockets[mic_sock].socket.state == SYN) + { + sent_size = IP_send(pdu, tab_sockets[mic_sock].dist_addr); + } + else if (tab_sockets[mic_sock].socket.state == ESTABLISHED) + { + break; + } + } return sent_size; } - /* * Permet à l’application réceptrice de réclamer la récupération d’une donnée * stockée dans les buffers de réception du socket * Retourne le nombre d’octets lu ou bien -1 en cas d’erreur * NB : cette fonction fait appel à la fonction app_buffer_get() */ -int mic_tcp_recv (int socket, char* mesg, int max_mesg_size) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - if(!valid_socket(socket)){ +int mic_tcp_recv(int socket, char *mesg, int max_mesg_size) +{ + printf("[MIC-TCP] Appel de la fonction: "); + printf(__FUNCTION__); + printf("\n"); + + if (!valid_socket(socket)) + { return -1; } int delivered_size; - mic_tcp_payload *payload; - payload->data= mesg; + mic_tcp_payload *payload = malloc(sizeof(mic_tcp_payload)); + payload->data = mesg; payload->size = max_mesg_size; + printf("procède au app_buffer_get\n"); delivered_size = app_buffer_get(*payload); - + printf("payload récupéré\n"); return delivered_size; - } - /* * Permet de traiter un PDU MIC-TCP reçu (mise à jour des numéros de séquence * et d'acquittement, etc.) puis d'insérer les données utiles du PDU dans * le buffer de réception du socket. Cette fonction utilise la fonction * app_buffer_put(). Elle est appelée par initialize_components() */ -void process_received_PDU(mic_tcp_pdu pdu, mic_tcp_sock_addr addr) { - printf("[MIC-TCP] Appel de la fonction: "); - printf(__FUNCTION__); printf("\n"); - - /* - mic_tcp_sock_addr addr_emetteur = addr //pour clarification - //éventuellement trouver les bons socket, buffer et app - for (int iint valid_socket(int socket) =0; i socket_desc-1 || tab_sockets[socket].fd == -1){ - //printf("ah, ton socket il existe pas\n"); +int valid_socket(int socket) +{ + if (socket > socket_desc - 1 || tab_sockets[socket].socket.fd == -1) + { + // printf("ah, ton socket il existe pas\n"); return 0; } return 1; } -int bound_socket(int socket){ - if (tab_sockets[socket].addr.ip_addr_size ==-1){ - //printf("socket not bound\n"); +int bound_socket(int socket) +{ + if (tab_sockets[socket].socket.state == IDLE || tab_sockets[socket].socket.state == CLOSING || tab_sockets[socket].socket.state == CLOSED ) + { + // printf("socket not bound\n"); return 0; } return 1; } +int same_addr(mic_tcp_sock_addr *addr1, mic_tcp_sock_addr *addr2) +{ + if (addr1->port == addr2->port && addr1->ip_addr_size == addr2->ip_addr_size && !memcmp(addr1->ip_addr, addr2->ip_addr, addr1->ip_addr_size)) + { + return 1; + } + return 0; +} + +void display_mic_tcp_pdu(mic_tcp_pdu pdu, char* prefix) { + printf("------------------------------------------\n%s\n", prefix); + printf("Source Port: %hu\n", pdu.header.source_port); + printf("Destination Port: %hu\n", pdu.header.dest_port); + printf("Sequence Number: %u\n", pdu.header.seq_num); + printf("Acknowledgment Number: %u\n", pdu.header.ack_num); + printf("SYN Flag: %d\n", pdu.header.syn); + printf("ACK Flag: %d\n", pdu.header.ack); + printf("FIN Flag: %d\n", pdu.header.fin); + printf("Payload Size: %d\n", pdu.payload.size); + if (pdu.payload.data != NULL) { + printf("Payload Data: %.*s\n", pdu.payload.size, pdu.payload.data); + } else { + printf("Payload Data is NULL\n"); + } + printf("----------------------------------\n"); +} +void display_enhanced_socket(enhanced_socket sock,char* prefix) { + printf("----------------------------------\n"); + printf("%s\n", prefix); + printf("Socket File Descriptor: %d\n", sock.socket.fd); + + const char* protocol_states[] = {"IDLE", "CLOSED", "SYN_SENT", "SYN_RECEIVED", "ESTABLISHED", "CLOSING", "ACCEPTING", "WAITING"}; + + + printf("Socket Protocol State: %s\n", protocol_states[sock.socket.state]); + + printf("Socket Address IP: %.*s\n", sock.socket.addr.ip_addr_size, sock.socket.addr.ip_addr); + printf("Socket Address Port: %hu\n", sock.socket.addr.port); + printf("Remote Address IP: %.*s\n", sock.dist_addr.ip_addr_size, sock.dist_addr.ip_addr); + printf("Remote Address Port: %hu\n", sock.dist_addr.port); + printf("Local Sequence Number: %d\n", sock.NoSeqLoc); + printf("Remote Sequence Number: %d\n", sock.NoSeqDist); + printf("----------------------------------\n"); +} - - +void display_mic_tcp_sock_addr(mic_tcp_sock_addr addr, char* prefix) { + printf("%s\n", prefix); + printf("IP Address: %.*s\n", addr.ip_addr_size, addr.ip_addr); + printf("Port: %hu\n", addr.port); +}