From eb7b12f64226ea02f2976d2b763fdca23cfcb889 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Fri, 10 Mar 2017 17:35:54 +0100 Subject: [PATCH] Kernel version 0.9 : TCP, more rewrite & bugfix --- A2OSX.BOOT.po | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/ARP.S.txt | 4 +- LIB/LIBTCPIP.S.SKT.txt | 240 +++++++++++++++------------ LIB/LIBTCPIP.S.TCP.txt | 367 ++++++++++++++++++----------------------- LIB/LIBTCPIP.S.txt | 7 - SBIN/DHCPCLNT.S.txt | 4 +- 7 files changed, 303 insertions(+), 319 deletions(-) diff --git a/A2OSX.BOOT.po b/A2OSX.BOOT.po index dbe129d827c06fc5ee3d1e6e686d5370737cb8b3..c20ee3caa6c650e617b95758434104d9c95ed3df 100644 GIT binary patch delta 5116 zcmb_geNbChcGuGf$QbYggAriNl`L$7F`ojzyh|L%U$J93v6Far<2YNTvuPHc3%X%thUf-fL&%>hHOPF-Zf7ic+YaySLu z*t@Jhp8;9YJ~U)c?;WJY9N63UHY-xFUOdA%q=RVa3FQ8|D+NY&}JK5gvl_nWZ%`){mTq^xNl`B z1+(4I)_E&F{jpPE!WUd}QZS4SGXBJ7|H5W}8RM@3MH8U&Fyq%V{szXs4FZdK8G6RIi}5|gyknIPpnfZS_QMAa)dp?7$64uon)$rS{N239-sf2&(d3Z! zqM?V8$szpBOBe6EB+r_>Pk&yjMWfzder9nVXJx(kI^#gEtQRzV?$`2D#&dxU}G33bFA>wtXzJ9zK0dY}B<^8GQkn@;(bO8W(O zhDD=QeJjz9b%9%hH--IhGr^J`p7NxmGi-l~*N&cHJ*n`8T!KL9`)KHUV3+jw4!*n} ze%{mw5V{NyQW?mE3Z1G36*^bWv2qze=gRA>TqwF=SN-T2Z%cH&vk8kCsBsOLYa~eB zMpyBALC1{M;V)BRfO=msp+hM@zz@j4*MlkdT-PkYZ|*(({wKLPA{dRY`?i8)+alOR zZwjR*HE^0sax$m`#vgublaIiosZdHWsO~Ll`cn>qykfMsK1ied^~ByrLg;`nIXH*| z|3IL8wJXZkhoaRk<>!2DD9W83RgssS|9sJl=bPH8~hZ z?~C5V)iSEhyKKCcYVo#?ucMyzK0RLA_#htMhRbAqymuSs9>kt_caJB|o5ZcqmWqp> zxC5d=CHN)GkXZ7p_g}{=o!hZ*2R8AvkQ0h`ZpYkq@b-A;4$SQUyUSnjWzu%sq1gk= z!_tmS4}3Kq$&wA|aH|VN3gqIzb!O7SS9{`tFD5nJo;Z4XvnxA7$vV`zQ6f$aya#H7 zC4tGoxEdLQxl#*OvV?x88c>ITs2av>JW9)2K{Lg&%BmsE_G0#w9bDzqVHVg=wW;SH zX4xssDtpJ;*z`3_cEw?A%+5w$>r=%nzbmG1In4O&>}Q7oii8Q)kPr^tj3`4d%esQZ z(X-KPb)U}u*WSrLR5;r(+|Q%DM$q&!_}3raRIK69O}LuENJAeJVS~1)PHBky8SEMd zhC}GFnxFRl&e5Y7fdV2}G~9;a#`AdHSR3{zm%8a0a(6=vR_<4)l-9U(AFf{EZ^JzG z9t>{?1LvAH9ISxG88rPIx+`;nG%$=Zzz8&S`~DjM(1ro9)=)H}Q92?<`7pnhq@z!V z8Tml>CHWR_6*ZnHU#aG(OuhjQNCTcIxp+QLO<0-ab2mY$X$auSwctR_)xoG6>}uyW z+yyLZtraQm2Fq^%kk6}7pJSy?Z{4-hnrT)p3SThF+Hm+nzMOzHXjMb7z!6BAI*>aF z*=8ml-6~&}Y~JJ7s@IQgJjAa9K(zxV0ZUPW6#GBd0Frd}Xe%H~XYXkS-iy}|#EKDX z%z9*!YsNkmtG=Dsw+r)HQ#dr625dKURKWHb6Faf2OYFjdSyPABJqv>8u0V|XU107? zGnU^2ESoxa;ysJ60G2yhr4$Y_%2~Y{#Zx?l7!b99%FtM6Z3Kyy<5>JndN!vR}%>m*`nYMa7sa!J?5{ zg*g-Um118R_LXDbY77UNI`6N*-hY{>plZEuO;kE_d-y`n0;*|7r7b2$WNUC8+EN!Z zLpfxQ=#&bOT@135FKXolUKdI(qdZCE15R;_aqtD9Bu{^kR7!W7Itov>$0PZQR@CqX zo@9^efv!&>&O&a1ZR^Ok)q$D8q+|D8W6gAVH^nQKXKZJ3pe^2m@x5#-j#&wN1!z$Q z8Z0LoRBPoNdt-e>2e>J%C*p;Iz{Fq-U0olnMmw8%V<>t0pX^jQMu(dL(hewWlBe%* zECY@u;}N}_kE$AjhV)r9j6+-xS$~VSadN$J6Nn$Na;;v+WRde?-H6paMF!l{&`!A% zKe`c{lC`mE`^7r075g@0ks^cAQ)uWAa!+?np)VncNSm;O=`%gM8IbKxsOxX2?Y+G~ zMCPECaLA&}A#;h|pq~-dHaWy)a89Bc*WzuyZgrv+&3wI}VM5W}x6K%`X1m{vyCLn+ z)6z;nJydopu~dXR>v459SA?aK^k4~=Ok@!7AeCcg8u-ewv>HRf$F0V8xcwE)FUO{e zabRM474ADkZZ;ivNj9D}b>?CBd|*!3nUB3^u2(tpuzW3%kEMJJq3QR&d~iiF@4oGN zAMjm_nQJjXp|lELn*bC_rPy>N#+72J3?G@`%I*m)Ap%WAVBxm}7N`O{3$golAhu@_ zE^^P}ZeA0Y_3dSfH*&qeSwM6s#8P2ehr(~_P@?Lfo*Q&fk4Kf{f)$w&g-TU=>>yOv>*Gu*9)eB5)b0M>Z z+0R(+`;Ysk*-d!0ZH?`Ot;_arwwNt$D``ppYBbVOR<45G(GyS!ibhgU4*W__6|U}N z6GtJ3f|F%x9jJA+P-h1>_u2-|=qdD<)8>dq&W;*MJl=RW^jB|Hve4$WNL+`$T4(=p zb>cZlr-@^%^c)*ml#a2Ji^1ihM!3*>jOCtV9mDDjyftESR$xNOdS~LDn7HV$H<|_h zB{Qk42Yzax%2qCk5ue#Pj;fwv4)i8GVrzALZU17?2XofJt!6u-rngrf7FsW5TY*gUki6DtX3z%7c> zm?>I<8OXLvK@Sc=aK9pb?KE}|)MQa*&J}ncVBaXwcwatNwvWv3POQLkMS{jK1ip~x zqwnpR1ybi@x7%wsV_F}{Q;O~=vmg)07G0-dyy0MbU}5K?@(4JM>BvIbX^t$Worbx# zkan7Di{Lbp8JnI07BiMC7+5R>v1CttCar-PF&o10t!`0k@zI$RxR$t|a8Qq_P*{)70UC4-S z_E3l|GrU9sEPs(!bf~Q%5Hn1`6JfFi{bNJ0Or4;V>%eR9B=1-s7MmOyp|o5@!brvo z3A*ld;bQK+LqJDZpb<5w%-I?wN^Jn0pl~8pT%)Lko@gYE217}r7^sFsO@{{d2t+$SdVxmI zP#Vn(RIVB-H=r%(ar2*>Uoij5Tu^H%ws_6w&2cltw^B4@LP8-F@*Hg$saa<1uYpK* z3~05Ij1TN-qc-IU+hCwiFa8&#@1p~M*G8@R5p5Cjk#4N71pNepo^TWxgtO2DBN3fa z<@&8)c*i}%v|QZau{apMeBg!qsjjT5b{76#-a_S9 zH(~ex2CjB!+}8r*%rsE3z#pcYv3tTHWRZe~T~g3A>!GBw4eZ}Xl{>lZI1uZ|;&xzu zwV?mgZ#gTnn3bwKWiyF>b1(w`*U-4McWUUc{7G!i^*_7~YUOXg`yB8F_>LH0;7AY{ zNZ6@L3%mv_;R`wPO{i8DWj&uCN`4Gu`KsruZ-asQeN-`J8`!yz+W55k;_N8+f785X jspjXd?4vB&v-_z(>xcj66;Kz>Ju^=Iz2W6Jwfp}7K*|8v delta 4918 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 bj6*M2^@XQ)G5bbNfA0$8G11}CIMew*0YJ=t diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index bca4a080502ff61e9b0aa370b172f498b3df68ca..26f581cfa1f22d366a79025ec0a4118ae842037b 100644 GIT binary patch delta 20398 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 GetArgC >SYSCALL GetArgA >PUSHYA - >DEBUG - >SYSCALL SSCANF bcc CS.RUN.QUERY @@ -117,7 +115,7 @@ CS.RUN.DUMP >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.GETCACHE ldx #K.ARPCACHE.SIZE .1 lda (ZPPTR1) -* beq .4 + beq .4 ldy #S.ARPCACHE.IP+4 .2 dey diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index 93932406..77052c16 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -107,43 +107,33 @@ SKT.New.TCP >PUSHW S.TCB >SYSCALL GetMem bcs .9 - >STYA ZPTmpPtr2 txa ldy #S.SOCKET.SQ.hTCB sta (ZPTmpPtr3),y - ldy #S.TCB.INFREE + ldx #S.TCB.OUTTAIL+1 + +.10 stz SKT.TCBCache,x + dex + bpl .10 + lda #K.TCP.WSIZE - sta (ZPTmpPtr2),y - iny + sta SKT.TCBCache+S.TCB.INFREE + sta SKT.TCBCache+S.TCB.OUTFREE lda /K.TCP.WSIZE - sta (ZPTmpPtr2),y + sta SKT.TCBCache+S.TCB.INFREE+1 + sta SKT.TCBCache+S.TCB.OUTFREE+1 - ldy #S.TCB.OUTFREE - lda #K.TCP.WSIZE - sta (ZPTmpPtr2),y - iny - lda /K.TCP.WSIZE - sta (ZPTmpPtr2),y - - lda #0 - ldy #S.TCB.INUSED - sta (ZPTmpPtr2),y - iny - sta (ZPTmpPtr2),y - - ldy #S.TCB.OUTUSED - sta (ZPTmpPtr2),y - iny - sta (ZPTmpPtr2),y + stz SKT.TCBCache+S.TCB.INUSED + stz SKT.TCBCache+S.TCB.INUSED+1 + stz SKT.TCBCache+S.TCB.OUTUSED + stz SKT.TCBCache+S.TCB.OUTUSED+1 ldx #3 - ldy #S.TCB.SEQNUM+3 .1 lda A2osX.TIMER16,x - sta (ZPTmpPtr2),y - dey + sta SKT.TCBCache+S.TCB.SEQNUM,x dex bpl .1 @@ -165,6 +155,10 @@ SKT.New.TCP >PUSHW S.TCB ldy #S.SOCKET.SQ.hOutMem sta (ZPTmpPtr3),y + jsr SKT.StoreTCB + + jsr TCP.OUT.SYN + clc .9 rts */-------------------------------------- @@ -175,19 +169,19 @@ SKT.New.TCP >PUSHW S.TCB * ##Out : *\-------------------------------------- SKT.CloseA cmp #K.SKTTABLE.SIZE - bcs SKT.GetA.9 + bcs .9 jsr SKT.GetA.I bcs .9 cmp #S.SOCKET.SOCK.DGRAM - beq .8 + beq .1 cmp #S.SOCKET.SOCK.RAW - beq .8 + beq .1 cmp #S.SOCKET.SOCK.STREAM - bne SKT.GetA.9 + bne .9 ldy #S.SOCKET.SO lda (ZPPtrSKT),y @@ -199,13 +193,44 @@ SKT.CloseA cmp #K.SKTTABLE.SIZE lda (ZPPtrSKT),y ora #S.TCP.OPTIONS.FIN sta (ZPPtrSKT),y + + jsr TCP.OUT Try to push FIN + clc rts +.9 lda #ERR.SKT.BAD + sec + rts + +.1 ldy #S.SOCKET.HQ.TAIL + lda (ZPPtrSKT),y + ldy #S.SOCKET.HQ.HEAD + cmp (ZPPtrSKT),y + beq .8 + + pha + clc + adc #S.SOCKET.HQ + tax + pla + inx + cmp #S.SOCKET.HQ.MAX + beq .2 + + lda #0 +.2 + ldy #S.SOCKET.HQ.TAIL + sta (ZPPtrSKT),y + + txa + >SYSCALL FreeMemA + bra .1 + .8 lda #0 sta (ZPPtrSKT) clc -.9 rts + rts */-------------------------------------- * #SKT.GetA * Get Ptr to socket @@ -402,8 +427,7 @@ SKT.Write.RAW ldy #S.SOCKET.RAW.PROTO jmp FRM.SendIP -.9 sec - rts +.9 rts *-------------------------------------- SKT.Write.TCP ldy #S.SOCKET.TCP.STATUS lda (ZPPtrSKT),y @@ -413,7 +437,7 @@ SKT.Write.TCP ldy #S.SOCKET.TCP.STATUS jsr SKT.AddDataToSktOut bcs .90 - jsr TCP.OUT.ESTBLSH try to push, ignore error.... + jsr TCP.OUT try to push, ignore error.... clc rts @@ -566,37 +590,7 @@ SKT.Read.I jsr SKT.GetA.I bne .91 IO err jsr SKT.GetDataFromSktIn - bcs .99 No data... - - >STYA TmpOffset - ldy #S.TCB.ACKNUM - lda (ZPPtrSKT),y - clc - adc TmpOffset - sta (ZPPtrSKT),y - - iny - lda (ZPPtrSKT),y - adc TmpOffset+1 - sta (ZPPtrSKT),y - - iny - lda (ZPPtrSKT),y - adc #0 - sta (ZPPtrSKT),y - iny - lda (ZPPtrSKT),y - adc #0 - sta (ZPPtrSKT),y - - ldy #S.SOCKET.TCP.OPTIONS - lda (ZPPtrSKT),y - ora #S.TCP.OPTIONS.ACK - sta (ZPPtrSKT),y - - >LDYA TmpOffset - clc - rts + rts if CS, No data... .90 lda #ERR.SKT.BAD sec @@ -642,45 +636,54 @@ SKT.AddToQueueA sta .2+1 * Src : A,X * Dst : hOutMem/OUTTAIL *-------------------------------------- -SKT.FreeDataFromSktOutAX - pha - ldy #S.TCB.OUTTAIL - clc - adc (ZPPtrSKT),y - sta (ZPPtrSKT),y - - iny - txa - adc (ZPPtrSKT),y - and /K.TCP.WSIZE-1 - sta (ZPPtrSKT),y +SKT.AckDataToSktOut + jsr SKT.GetTCB - pla - sta .1+1 - stx .2+1 - - ldy #S.TCB.OUTFREE - clc - adc (ZPPtrSKT),y - sta (ZPPtrSKT),y - - iny - txa - adc (ZPPtrSKT),y - sta (ZPPtrSKT),y + ldy #S.TCP.ACK.NUMBER+3 Get new ACK number from FrameIn... + ldx #0 Substract old Ack from socket - ldy #S.TCB.OUTUSED sec - lda (ZPPtrSKT),y -.1 sbc #$ff - sta (ZPPtrSKT),y - iny - adc (ZPPtrSKT),y -.2 sbc #$ff - sta (ZPPtrSKT),y +.1 lda (ZPFrameInPtr),y + pha + sbc SKT.TCBCache+S.TCB.ACKNUM,x + sta TmpDWord,x + pla + sta SKT.TCBCache+S.TCB.ACKNUM,x + dey + inx + cpx #4 + bpl .1 - rts + lda SKT.TCBCache+S.TCB.OUTTAIL + clc + adc TmpDWord + sta SKT.TCBCache+S.TCB.OUTTAIL + + lda SKT.TCBCache+S.TCB.OUTTAIL+1 + adc TmpDWord+1 + and /K.TCP.WSIZE-1 + sta SKT.TCBCache+S.TCB.OUTTAIL+1 + + lda SKT.TCBCache+S.TCB.OUTFREE + clc + adc TmpDWord + sta SKT.TCBCache+S.TCB.OUTFREE + + lda SKT.TCBCache+S.TCB.OUTFREE+1 + adc TmpDWord+1 + sta SKT.TCBCache+S.TCB.OUTFREE+1 + + lda SKT.TCBCache+S.TCB.OUTUSED + sec + sbc TmpDWord + sta SKT.TCBCache+S.TCB.OUTUSED + + lda SKT.TCBCache+S.TCB.OUTUSED+1 + sbc TmpDWord+1 + sta SKT.TCBCache+S.TCB.OUTUSED+1 + + jmp SKT.StoreTCB *-------------------------------------- * From TCP.IN * Src : ZPDataInPtr/ZPDataInLen @@ -856,15 +859,25 @@ SKT.AddDataToSktOut adc ZPDataInLen+1 sta SKT.TCBCache+S.TCB.OUTUSED+1 - jmp SKT.StoreTCB + lda SKT.TCBCache+S.TCB.SEQNUM + clc + adc ZPDataInLen + sta SKT.TCBCache+S.TCB.SEQNUM + lda SKT.TCBCache+S.TCB.SEQNUM+1 + adc ZPDataInLen+1 + sta SKT.TCBCache+S.TCB.SEQNUM+1 + bcc .80 + inc SKT.TCBCache+S.TCB.SEQNUM+2 + bne .80 + inc SKT.TCBCache+S.TCB.SEQNUM+3 + +.80 jmp SKT.StoreTCB *-------------------------------------- * From TCP.OUT * Src : hOutMem/OUTTAIL * Dst : ZPDataOutPtr/ZPDataOutLen *-------------------------------------- SKT.GetDataFromSktOut - jsr SKT.GetTCB - ldy #S.SOCKET.SQ.hOutMem lda (ZPPtrSKT),y @@ -920,7 +933,8 @@ SKT.GetDataFromSktOut sta ZPTmpPtr2+1 bra .1 -.8 jmp SKT.StoreTCB +.8 clc + rts *-------------------------------------- * From SKT.Read * In: @@ -1043,7 +1057,27 @@ SKT.GetDataFromSktIn sbc ZPTmpPtr3+1 sta SKT.TCBCache+S.TCB.INUSED+1 - jsr SKT.StoreTCB + lda SKT.TCBCache+S.TCB.ACKNUM + clc + adc ZPTmpPtr3 + sta SKT.TCBCache+S.TCB.ACKNUM + + lda SKT.TCBCache+S.TCB.ACKNUM+1 + adc ZPTmpPtr3+1 + sta SKT.TCBCache+S.TCB.ACKNUM+1 + + bcc .80 + inc SKT.TCBCache+S.TCB.ACKNUM+2 + bne .80 + inc SKT.TCBCache+S.TCB.ACKNUM+3 + +.80 jsr SKT.StoreTCB + + ldy #S.SOCKET.TCP.OPTIONS + lda (ZPPtrSKT),y + ora #S.TCP.OPTIONS.ACK + sta (ZPPtrSKT),y + >LDYA ZPTmpPtr3 clc rts diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index ebf0a52f..7bd539d9 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -131,34 +131,29 @@ TCP.IN.JMP.LISTEN lda #ERR.SKT.OOS .9 rts -.3 jsr ARP.AddFromFrameInPtr +.3 jsr SKT.GetTCB - ldy #S.TCP.SEQ.NUMBER+3 + ldy #S.TCP.SEQ.NUMBER ldx #3 sec .1 lda (ZPFrameInPtr),y Set ACK=SEQ+1 for new socket... adc #0 - sta TmpDWord,x - dey + sta SKT.TCBCache+S.TCB.ACKNUM,x + iny dex bpl .1 - ldx #3 - ldy #S.TCB.ACKNUM+3 - -.4 lda TmpDWord,x Update new socket with ACK number - sta (ZPPtrSKT),y - dey - dex - bpl .4 + jsr SKT.StoreTCB + jsr ARP.AddFromFrameInPtr + jsr TCP.OUT.SYNACK bcs .9 ldy #S.SOCKET.TCP.STATUS - lda #S.SOCKET.TCP.STATUS.SYNSENT + lda #S.SOCKET.TCP.STATUS.SYNRCVD sta (ZPPtrSKT),y @@ -166,144 +161,161 @@ TCP.IN.JMP.LISTEN rts *-------------------------------------- TCP.IN.JMP.SYNSENT + ldy #S.TCP.OPTIONS only accept SYN.ACK packet + lda (ZPFrameInPtr),y + cmp #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK + bne .8 + + + + + + ldy #S.SOCKET.TCP.STATUS + lda #S.SOCKET.TCP.STATUS.ESTBLSH + sta (ZPPtrSKT),y + +.8 clc + rts +*-------------------------------------- +TCP.IN.JMP.SYNRCVD ldy #S.TCP.OPTIONS only accept ACK packet lda (ZPFrameInPtr),y cmp #S.TCP.OPTIONS.ACK bne .8 + jsr SKT.GetTCB + ldx #3 - ldy #S.TCB.SEQNUM+3 - + ldy #S.TCP.ACK.NUMBER + sec -.10 lda (ZPPtrSKT),y +.1 lda SKT.TCBCache+S.TCB.SEQNUM,x adc #0 - sta TmpDWord,x - dey - dex - bpl .10 - - ldx #3 - ldy #S.TCP.ACK.NUMBER+3 -.11 lda (ZPFrameInPtr),y - cmp TmpDWord,x + sta SKT.TCBCache+S.TCB.SEQNUM,x + eor (ZPFrameInPtr),y bne .8 - dey + iny dex - bpl .11 + bpl .1 - ldx #3 - ldy #S.TCB.SEQNUM+3 -.12 lda TmpDWord,x - sta (ZPPtrSKT),y - dey - dex - bpl .12 + jsr SKT.StoreTCB ldy #S.SOCKET.TCP.STATUS lda #S.SOCKET.TCP.STATUS.ESTBLSH - sta (ZPPtrSKT),y - + sta (ZPPtrSKT),y .8 clc rts *-------------------------------------- -TCP.IN.JMP.SYNRCVD - clc - rts -*-------------------------------------- TCP.IN.JMP.ESTBLSH + jsr SKT.GetTCB + ldy #S.TCP.OPTIONS lda (ZPFrameInPtr),y bit #S.TCP.OPTIONS.ACK - beq .2 + beq .1 - ldy #S.TCP.ACK.NUMBER+3 Get new ACK number from FrameIn... - ldx #3 - -.1 lda (ZPFrameInPtr),y - sta TmpDWord,x - dey - dex - bpl .1 - - ldy #S.TCB.ACKNUM Substract old Ack from socket - sec - lda (ZPPtrSKT),y - sbc TmpDWord - pha save result LO for FreeData + jsr SKT.AckDataToSktOut - lda TmpDWord - sta (ZPPtrSKT),y and store new ACK in skt - - iny - lda (ZPPtrSKT),y - sbc TmpDWord+1 - - tax save result HI for FreeData - - lda TmpDWord+1 we stop here, will never be more than K.TCP.WSIZE - sta (ZPPtrSKT),y - - iny - lda TmpDWord+2 - sta (ZPPtrSKT),y - - iny - lda TmpDWord+3 - sta (ZPPtrSKT),y - - pla - jsr SKT.FreeDataFromSktOutAX -*---------- -.2 lda ZPDataInLen +.1 lda ZPDataInLen ora ZPDataInLen+1 - beq .8 No data in this incoming frame... - - ldy #S.TCP.SEQ.NUMBER+3 - ldx #3 - -.3 lda (ZPFrameInPtr),y - sta TmpDWord,x - dey - dex - bpl .3 + beq .2 No data in this incoming frame... jsr TCP.SetDataInPtrAndLen jsr SKT.AddDataToSktIn + bcs .9 +.2 ldy #S.TCP.OPTIONS + lda (ZPFrameInPtr),y + bit #S.TCP.OPTIONS.FIN + beq .1 + + ldy #S.SOCKET.TCP.STATUS + lda #S.SOCKET.TCP.STATUS.CLWAIT + sta (ZPPtrSKT),y + + ldy #S.SOCKET.TCP.OPTIONS + lda (ZPPtrSKT),y + ora #S.TCP.OPTIONS.ACK + sta (ZPPtrSKT),y + +.8 jsr SKT.StoreTCB + + clc +.9 rts +*-------------------------------------- +TCP.IN.JMP.CLWAIT + + clc + rts +*-------------------------------------- +TCP.IN.JMP.LASTACK + ldy #S.TCP.OPTIONS only accept ACK packet + lda (ZPFrameInPtr),y + cmp #S.TCP.OPTIONS.ACK + bne .8 + + ldy #S.SOCKET.SQ.hOutMem + lda (ZPPtrSKT),y + beq .1 + >SYSCALL FreeMemA + +.1 ldy #S.SOCKET.SQ.hInMem + lda (ZPPtrSKT),y + beq .2 + >SYSCALL FreeMemA + +.2 ldy #S.SOCKET.SQ.hTCB + lda (ZPPtrSKT),y + beq .3 + >SYSCALL FreeMemA + +.3 lda #0 + sta (ZPPtrSKT) .8 clc rts *-------------------------------------- -TCP.IN.JMP.CLWAIT -TCP.IN.JMP.LASTACK TCP.IN.JMP.FINWT1 +*-------------------------------------- TCP.IN.JMP.FINWT2 +*-------------------------------------- TCP.IN.JMP.CLOSING +*-------------------------------------- TCP.IN.JMP.TIMEWT clc rts *-------------------------------------- -TCP.OUT.SYNACK >LDYAI 0 +TCP.OUT.SYN >LDYAI 0 jsr TCP.NewFrame bcs .9 ldx #3 - ldy #S.TCP.ACK.NUMBER+3 + ldy #S.TCP.SEQ.NUMBER -.1 lda TmpDWord,x +.1 lda SKT.TCBCache+S.TCB.SEQNUM,x sta (ZPFrameOutPtr),y - dey + iny dex bpl .1 ldy #S.TCP.OPTIONS - lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK + lda #S.TCP.OPTIONS.SYN sta (ZPFrameOutPtr),y - jsr TCP.SendFrame + iny S.TCP.WINDOW + lda /K.TCP.WSIZE + sta (ZPFrameOutPtr),y + iny + lda #K.TCP.WSIZE + sta (ZPFrameOutPtr),y + + ldy #S.TCP.SEQ.NUMBER + ldx #3 + + jsr FRM.SendIP bcs .9 ldy #S.SOCKET.TCP.OPTIONS @@ -317,14 +329,58 @@ TCP.OUT.SYNACK >LDYAI 0 clc .9 rts *-------------------------------------- -TCP.OUT.ESTBLSH ldy #S.TCB.OUTUSED - lda (ZPPtrSKT),y +TCP.OUT.SYNACK >LDYAI 0 + jsr TCP.NewFrame + bcs .9 - pha + ldx #3 + ldy #S.TCP.SEQ.NUMBER +.1 lda SKT.TCBCache+S.TCB.SEQNUM,x + sta (ZPFrameOutPtr),y iny - lda (ZPPtrSKT),y - ply + dex + bpl .1 + + ldy #S.TCP.ACK.NUMBER + ldx #3 + +.3 lda SKT.TCBCache+S.TCB.ACKNUM,x + sta (ZPFrameOutPtr),y + iny + dex + bpl .3 + + ldy #S.TCP.OPTIONS + lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK + sta (ZPFrameOutPtr),y + + iny S.TCP.WINDOW + lda /K.TCP.WSIZE + sta (ZPFrameOutPtr),y + iny + lda #K.TCP.WSIZE + sta (ZPFrameOutPtr),y + + jsr FRM.SendIP + bcs .9 + + ldy #S.SOCKET.TCP.OPTIONS + lda #0 + sta (ZPPtrSKT),y + + ldy #S.SOCKET.TCP.STATUS + lda #S.SOCKET.TCP.STATUS.SYNSENT + sta (ZPPtrSKT),y + + clc +.9 rts +*-------------------------------------- +TCP.OUT jsr SKT.GetTCB + + lda SKT.TCBCache+S.TCB.OUTUSED+1 + ldy SKT.TCBCache+S.TCB.OUTUSED + bne .1 tax @@ -344,110 +400,32 @@ TCP.OUT.ESTBLSH ldy #S.TCB.OUTUSED bcs .9 jsr SKT.GetDataFromSktOut - - ldy #S.TCB.SEQNUM compute new SEQ.NUM - lda (ZPPtrSKT),y - clc - adc TmpOffset - sta TmpDWord - - iny - lda (ZPPtrSKT),y - adc TmpOffset+1 - sta TmpDWord+1 - - iny - lda (ZPPtrSKT),y - adc #0 - sta TmpDWord+2 - - iny - lda (ZPPtrSKT),y - adc #0 - sta TmpDWord+3 - - ldy #S.TCP.SEQ.NUMBER+3 - ldx #3 - -.3 lda TmpDWord,x - sta (ZPFrameOutPtr),y - dey - dex - bpl .3 - + ldy #S.SOCKET.TCP.OPTIONS lda (ZPPtrSKT),y ldy #S.TCP.OPTIONS sta (ZPFrameOutPtr),y -.7 jsr TCP.SendFrame +.7 jsr FRM.SendIP bcs .9 ldy #S.SOCKET.TCP.OPTIONS lda (ZPPtrSKT),y bit #S.TCP.OPTIONS.FIN - beq .70 + beq .8 ldy #S.SOCKET.TCP.STATUS lda #S.SOCKET.TCP.STATUS.FINWT1 sta (ZPPtrSKT),y -.70 ldy #S.SOCKET.TCP.OPTIONS +.8 ldy #S.SOCKET.TCP.OPTIONS lda #0 sta (ZPPtrSKT),y - ldx #3 - ldy #S.TCB.SEQNUM+3 + jmp SKT.StoreTCB -.71 lda TmpDWord,x - sta (ZPPtrSKT),y - dey - dex - bpl .71 - -.8 clc .9 rts *-------------------------------------- -TCP.GetSktAckNum - ldy #S.TCP.ACK.NUMBER - ldx #4 - -.1 lda (ZPFrameInPtr),y - pha - iny - dex - bne .1 - - ldy #S.TCB.ACKNUM+3 - ldx #4 - -.2 pla - sta (ZPPtrSKT),y - dey - dex - bne .2 - rts -*-------------------------------------- -TCP.UpdateSktAckNum - ldy #S.TCB.ACKNUM+3 - lda (ZPPtrSKT),y - clc - adc ZPDataInLen - sta (ZPPtrSKT),y - dey - lda (ZPPtrSKT),y - adc ZPDataInLen+1 - sta (ZPPtrSKT),y - dey - lda (ZPPtrSKT),y - adc #0 - sta (ZPPtrSKT),y - dey - lda (ZPPtrSKT),y - adc #0 - sta (ZPPtrSKT),y - rts -*-------------------------------------- TCP.SetDataInPtrAndLen ldy #S.TCP.DATAOFFSET lda (ZPFrameInPtr),y @@ -529,25 +507,6 @@ TCP.NewFrame ldx #S.IP.PROTOCOL.TCP clc .9 rts *-------------------------------------- -TCP.SendFrame ldy #S.TCB.SEQNUM+7 - ldx #7 - -.1 lda (ZPPtrSKT),y - pha - dey - dex - bpl .1 - - ldy #S.TCP.SEQ.NUMBER - -.2 pla - sta (ZPFrameOutPtr),y - iny - cpy #S.TCP.SEQ.NUMBER+8 - bne .2 - - jmp FRM.SendIP -*-------------------------------------- TCP.ComputeChecksum lda #0 RESET.TCP.CHECKSUM ldy #S.TCP.CHECKSUM diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 7fc89832..b8731ee6 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -182,13 +182,6 @@ PULSEA and #S.EVT.F.T1SEC .1 jsr DNS.POLL jmp FRM.RETRY *-------------------------------------- -ToLowerCaseA cmp #'A' - bcc .1 - cmp #'Z'+1 - bcs .1 - adc #$20 -.1 rts -*-------------------------------------- GetDynPort inc DYNPORT.LAST bne .1 inc DYNPORT.LAST+1 diff --git a/SBIN/DHCPCLNT.S.txt b/SBIN/DHCPCLNT.S.txt index b9d7362e..ab5c51a2 100644 --- a/SBIN/DHCPCLNT.S.txt +++ b/SBIN/DHCPCLNT.S.txt @@ -458,7 +458,7 @@ Socket .DA #S.SOCKET.SOCK.DGRAM DHCP.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS DHCP.DISC.XID .BS 4 .HS 0000 SECS - .DA S.DHCP.FLAGS.BRDCST + .DA 0000 S.DHCP.FLAGS.BRDCST .HS 00000000 CIADDR DHCP.DISC.YIADDR .HS 00000000 .HS 00000000 SIADDR @@ -475,7 +475,7 @@ DHCP.DISC.LEN .EQ *-DHCP.DISC DHCP.REQ .HS 01010600 OP,HTYPE,HLEN,HOPS DHCP.REQ.XID .BS 4 .HS 0000 SECS - .DA S.DHCP.FLAGS.BRDCST + .DA 0000 S.DHCP.FLAGS.BRDCST .HS 00000000 CIADDR DHCP.REQ.YIADDR .HS 00000000 .HS 00000000 SIADDR