📄 tcp_c source file.htm
字号:
00136 <SPAN class=comment> CC=8;*/</SPAN>
00137 CC=0;Debug(<SPAN class=stringliteral>"Ricevuto ack "</SPAN>);
00138 <SPAN class=keywordflow>while</SPAN> (SKK->flag&3) delay(5);
00139 Debug(<SPAN class=stringliteral>"2\n"</SPAN>);
00140 SKK->flag|=3;
00141 <SPAN class=keywordflow>if</SPAN> (SeqSIN>SKK->seqSIN) { CC|=2;
00142 <SPAN class=comment>/* for (tTCP=SKK->buflenTX,tTCP1=0;(tTCP1<(SeqSIN-SKK->seqSIN))&&</SPAN>
00143 <SPAN class=comment> (tTCP!=SKK->buflenW_TX);tTCP=(tTCP+1)%3000,tTCP1++) ;</SPAN>
00144 <SPAN class=comment> if ((SKK->buflenTX+=tTCP1)>=3000) SKK->buflenTX-=3000;</SPAN>
00145 <SPAN class=comment> SKK->seqSIN+=tTCP1;*/</SPAN>
00146 <SPAN class=comment>/* printf("ricTCP1: seqSIN=%x skk->seqSIN buflenTX=%u lungh=%u\n",SeqSIN,SKK->seqSIN,SKK->buflenTX,lungh);*/</SPAN> <SPAN class=keywordflow>if</SPAN> (SKK->buflenTX<(SeqSIN-SKK->seqSIN)) { SKK->flag&=0xfc; Errore(7,<SPAN class=stringliteral>"rxTCP:Ack SeqSIN errato"</SPAN>);}
00147 SKK->buflenTX-=(u_short)(SeqSIN-SKK->seqSIN);
00148 copymem(SKK->bufTX+(u_short)(SeqSIN-SKK->seqSIN),SKK->bufTX,SKK->buflenTX); <SPAN class=comment>/* OK */</SPAN>
00149 SKK->seqSIN=SeqSIN;
00150 <SPAN class=comment>/* printf("ricTCP2: seqSIN=%x skk->seqSIN buflenTX=%u lungh=%u\n",SeqSIN,SKK->seqSIN,SKK->buflenTX,lungh);*/</SPAN> CC|=4;
00151 }
00152 <SPAN class=keywordflow>if</SPAN> ((SeqACK<=SKK->seqACK)&&( (ttt=(SKK->seqACK-SeqACK)) <=(lungh-20))) {
00153 <SPAN class=comment>/* if (SeqACK==SKK->seqACK) { */</SPAN>
00154 <SPAN class=keywordflow>if</SPAN> ((SKK->buflenRX+lungh-20-ttt)<3000) {
00155 CC|=1;
00156 <SPAN class=comment>/* printf("ricTCP3: seqACK=%x skk->seqACK buflenRX=%u lungh=%u\n",SeqACK,SKK->seqACK,SKK->buflenRX,lungh);*/</SPAN>
00157 copymem(buffTCP+20+ttt,SKK->bufRX+SKK->buflenRX,lungh-20-ttt);
00158 SKK->seqACK+=(u_int)lungh-20-ttt;
00159 SKK->buflenRX+=lungh-20-ttt;
00160 <SPAN class=comment>/* printf("ricTCP4: seqACK=%x skk->seqACK buflenRX=%u lungh=%u\n",SeqACK,SKK->seqACK,SKK->buflenRX,lungh);*/</SPAN>
00161 }
00162 } <SPAN class=keywordflow>else</SPAN>
00163 <SPAN class=keywordflow>if</SPAN> (SeqACK<SKK->seqACK) CC|=1;
00164 SKK->flag&=0xfc;
00165 <SPAN class=keywordflow>if</SPAN> ((SKK->stato==3)&&(CC&1)&&(lungh-20)&&(!(FLAg&FIN))) MandaTcp(ACK);
00166 CC=0;
00167 }
00168 <SPAN class=keywordflow>if</SPAN> (FLAg&RST) <SPAN class=comment>/* ricevuto rst */</SPAN>
00169 deregistraIP(sk);
00170 <SPAN class=keywordflow>if</SPAN> (FLAg&FIN) { <SPAN class=comment>/* ricevuto fin */</SPAN>
00171 <SPAN class=keywordflow>if</SPAN> ((SKK->stato!=4)&&(SKK->stato!=3)) Errore(4,<SPAN class=stringliteral>"rxTCP:FinAck e socket!=3"</SPAN>);
00172 SKK->seqACK++;
00173 MandaTcp(ACK);
00174 <SPAN class=keywordflow>if</SPAN> (SKK->stato==3) {
00175 MandaTcp(FIN|ACK);
00176 SKK->stato=7;
00177 }
00178 }
00179 }
00180 errore:
00181 CC=0;
00182 <SPAN class=keywordflow>return</SPAN> 1;
00183 }
00184
00185 u_char nonsoTCP(u_int Ip,u_char *buffTCP,u_short lungh) {
00186 <SPAN class=preprocessor>#define lunghTcp ((bufTCP[12]&0xf0)>>2)</SPAN>
00187 <SPAN class=preprocessor></SPAN> Debug(<SPAN class=stringliteral>"nonsoTCP\n"</SPAN>);
00188 <SPAN class=keywordflow>if</SPAN> (lungh>3000) <SPAN class=keywordflow>return</SPAN> 0;
00189 setmem(bufTCP,0,lungh);
00190 copymem(buffTCP,bufTCP,lungh);
00191 Tcp(bufTCP,PrtSRC,PrtDST,SeqSIN,SeqACK,RST,3000);
00192 <SPAN class=keywordflow>if</SPAN> (SeqACK) { *(u_int *)(bufTCP+8)=scbyte4(SeqACK+1); *(bufTCP+13)|=ACK; }
00193 <SPAN class=keywordflow>if</SPAN> (!mandaIP(Ip,6,bufTCP,lungh)) Errore(6,<SPAN class=stringliteral>"nonsoTCP:errore mandaIP RST"</SPAN>);
00194 <SPAN class=keywordflow>return</SPAN> 1;
00195 errore:
00196
00197 <SPAN class=keywordflow>return</SPAN> 0;
00198 }
00199
00200
00201 <SPAN class=preprocessor>#undef SKK</SPAN>
00202 <SPAN class=preprocessor></SPAN><SPAN class=preprocessor>#define SKK Sok[tTCP]</SPAN>
00203 <SPAN class=preprocessor></SPAN>
00204 <SPAN class=preprocessor>#define passato(a) ((SKK->timeout+a)<adesso)</SPAN>
00205 <SPAN class=preprocessor></SPAN><SPAN class=preprocessor>#define passato2(a) ((SKK->timeout2+a)<adesso)</SPAN>
00206 <SPAN class=preprocessor></SPAN><SPAN class=keywordtype>void</SPAN> TimeoutTCP(u_short tTCP) {
00207 u_short tTCP1;
00208 <SPAN class=keywordflow>if</SPAN> (SKK->stato==1) { <SPAN class=comment>/* se e' in fase di instaurazione */</SPAN>
00209 <SPAN class=keywordflow>if</SPAN> passato(3) { <SPAN class=comment>/* se bisogna mandare il pacchetto SYN */</SPAN>
00210 Debug(<SPAN class=stringliteral>"MandaSYN"</SPAN>);
00211 SKK->timeout=adesso;
00212 setmem(bufTCP,0,20);
00213 Debug(<SPAN class=stringliteral>"TimeoutTCP stato=1 \n"</SPAN>);
00214 Tcp(bufTCP,SKK->PRTsrc,SKK->PRTdst,SKK->seqSIN,SKK->seqACK,SYN,3000);
00215 mandaIP(SKK->IPdst,6,bufTCP,20);
00216 } <SPAN class=keywordflow>else</SPAN> {
00217 <SPAN class=comment>/* if (reteDEBUG&2) printf("T=%u t2=%u\n",adesso,SKK->timeout2); */</SPAN>
00218 <SPAN class=keywordflow>if</SPAN> passato2(18)
00219 {
00220 Debug(<SPAN class=stringliteral>"timeout MandaSYN"</SPAN>);
00221 <SPAN class=comment>/* if (reteDEBUG&2) printf("Tempo=%u timeout2=%u\n",adesso,SKK->timeout2); */</SPAN>
00222 deregistraIP(tTCP);
00223 }
00224 }
00225 } <SPAN class=keywordflow>else</SPAN>
00226 <SPAN class=keywordflow>if</SPAN> (SKK->stato==2) { <SPAN class=comment>/* se e' in fase di listen e ha ricevuto un SIN */</SPAN>
00227 <SPAN class=keywordflow>if</SPAN> passato(3) { <SPAN class=comment>/* se bisogna mandare il pacchetto SINACK */</SPAN>
00228 SKK->timeout=adesso;
00229 setmem(bufTCP,0,20);
00230 Debug(<SPAN class=stringliteral>"TimeoutTCP stato=2 \n"</SPAN>);
00231 Tcp(bufTCP,SKK->PRTsrc,SKK->PRTdst,SKK->seqSIN,SKK->seqACK,SYN|ACK,3000);
00232 mandaIP(SKK->IPdst,6,bufTCP,20);
00233 SKK->flag=0;
00234 } <SPAN class=keywordflow>else</SPAN>
00235 <SPAN class=keywordflow>if</SPAN> passato2(10) {<SPAN class=comment>/* se va in timeout2 riporta il socket a 8 */</SPAN>
00236 setmem(bufTCP,0,20);
00237 Debug(<SPAN class=stringliteral>"Timeout2TCP stato=2 \n"</SPAN>);
00238 Tcp(bufTCP,SKK->PRTsrc,SKK->PRTdst,SKK->seqSIN,SKK->seqACK,RST|ACK,3000);
00239 mandaIP(SKK->IPdst,6,bufTCP,20);
00240 SKK->IPdst=0;SKK->PRTdst=0;SKK->timeout=0;SKK->timeout2=0;
00241 SKK->stato=8;
00242 }
00243 } <SPAN class=keywordflow>else</SPAN>
00244 <SPAN class=keywordflow>if</SPAN> (SKK->stato==4) { <SPAN class=comment>/* se e' in fase di chiusura */</SPAN>
00245 <SPAN class=keywordflow>if</SPAN> passato(3) { <SPAN class=comment>/* se bisogna mandare il pacchetto FINACK */</SPAN>
00246 SKK->timeout=adesso;
00247 setmem(bufTCP,0,20);
00248 Debug(<SPAN class=stringliteral>"TimeoutTCP stato=4 \n"</SPAN>);
00249 Tcp(bufTCP,SKK->PRTsrc,SKK->PRTdst,SKK->seqSIN,SKK->seqACK,FIN|ACK,3000);
00250 mandaIP(SKK->IPdst,6,bufTCP,20);
00251 } <SPAN class=keywordflow>else</SPAN>
00252 <SPAN class=keywordflow>if</SPAN> passato2(18) {
00253 setmem(bufTCP,0,20);
00254 Debug(<SPAN class=stringliteral>"Timeout2TCP stato=4 \n"</SPAN>);
00255 Tcp(bufTCP,SKK->PRTsrc,SKK->PRTdst,SKK->seqSIN,SKK->seqACK,RST|ACK,3000);
00256 mandaIP(SKK->IPdst,6,bufTCP,20);
00257 deregistraIP(tTCP);
00258 }
00259 } <SPAN class=keywordflow>else</SPAN>
00260 <SPAN class=keywordflow>if</SPAN> ((SKK->stato==3)&&(SKK->buflenTX)&&
00261 passato(5)) {
00262 Debug(<SPAN class=stringliteral>"TimeoutTCP stato=3"</SPAN>);
00263 <SPAN class=keywordflow>while</SPAN> (SKK->flag&1) delay(5);
00264 SKK->flag|=1;
00265 Debug(<SPAN class=stringliteral>" 1"</SPAN>);
00266 setmem(bufTCP,0,TCP_MTU+60);
00267 SKK->timeout=adesso;
00268 <SPAN class=keywordflow>if</SPAN> (SKK->buflenTX<TCP_MTU) tTCP1=SKK->buflenTX; <SPAN class=keywordflow>else</SPAN> tTCP1=TCP_MTU;
00269 copymem(SKK->bufTX,bufTCP+20,tTCP1);
00270 Tcp(bufTCP,SKK->PRTsrc,SKK->PRTdst,SKK->seqSIN,SKK->seqACK,PSH|ACK,3000);
00271 mandaIP(SKK->IPdst,6,bufTCP,tTCP1+20);
00272 SKK->flag&=0xfe;
00273 Debug(<SPAN class=stringliteral>" 0\n"</SPAN>);
00274 } <SPAN class=keywordflow>else</SPAN>
00275 <SPAN class=keywordflow>if</SPAN> (((SKK->stato==7)||(SKK->stato==4))&&(!SKK->buflenRX)&&passato2(13))
00276 deregistraIP(tTCP);
00277 }
00278
00279 <SPAN class=keywordtype>void</SPAN> Init_tcp() {
00280 <SPAN class=keywordflow>if</SPAN> (bufTCP==NULL) bufTCP=malloc(3000);
00281 }
</PRE></DIV>
<HR>
<ADDRESS style="align: right"><SMALL>Generato il Tue Jun 17 15:27:45 2003 per
ItaliOs da <A href="http://www.doxygen.org/index.html"><IMG height=53
alt=doxygen src="tcp_c Source File.files/doxygen.png" width=110 align=middle
border=0></A>1.3-rc3 </SMALL></ADDRESS></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -