From f856158b7b392f4bd01e23d55963ad12aeddd5af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Mon, 13 Feb 2017 08:26:18 +0100 Subject: [PATCH] Kernel version 0.9 : TCP & Sockets.... --- A2OSX.BOOT.po | Bin 143360 -> 143360 bytes A2OSX.DEV.po | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/ARP.S.txt | 4 +- BIN/PING.S.txt | 7 +- INC/LIBTCPIP.I.txt | 6 +- LIB/LIBTCPIP.S.FRM.txt | 142 ++++++++++++++++++++-------- LIB/LIBTCPIP.S.ICMP.txt | 20 ++++ LIB/LIBTCPIP.S.SKT.txt | 203 ++++++++++++++++++++++++---------------- LIB/LIBTCPIP.S.TCP.txt | 23 +++++ LIB/LIBTCPIP.S.txt | 14 +-- SBIN/DHCPCLNT.S.txt | 22 ++--- SYS/KERNEL.S.txt | 1 + _Docs/LIBTCPIP.md | 94 +++++++++++++++++-- 14 files changed, 378 insertions(+), 158 deletions(-) diff --git a/A2OSX.BOOT.po b/A2OSX.BOOT.po index 66203d8b0bc65c7f0a6d40c0332ccfd99f543ad9..86e2784256e3f1eb40087b2448c5e282fdde419e 100644 GIT binary patch delta 4969 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 delta 4733 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 Sl6Y}|I8P*qfy4kowEq{3qC(aH diff --git a/A2OSX.DEV.po b/A2OSX.DEV.po index e3dc08c2e10903b580b89e1ae82f98838d995833..8f16acd48c044f59eded5221ad7e39d30ea23630 100644 GIT binary patch delta 1709 zcmZuyS!^3s6n!s{VhE&#q_N|f@sg!!<91{_!8KGYqw%yciMR0>2_z8thzeA#s*-~E zYFrSiS`a~({viP$Ai+l|v`*~Aj-8Z1DNEVQl9Yrt>`?Z-fjjRxixIYTKkhmAp1VDJ zV8${qV>z6utvM+X^V3Yu_>PonPd&A@`VeU+;&UV^Cu3^2X2^yXiT5amcAu;z(!Kz( z9wzPSo;&X9@7s~?zjtR}IW(49#&__DDcI>HmKRBTY0U;=n}mTO z>z0?0p&4CrC}~6#^&wUjX?VHpP3r1`H%RQq%UcF~h?8`?J^JuK0;;BmBXLt(hn@eYP6dR&gh zHC-{nv8b%03R5D|yRb4V()VC}wuQbA3ACr+?rbal03OS>w0wxt4IlA%Ce3>D_=Cjq zG1uNS1!uEY(`j(#T=XTPO(5!=l zR}t}3DCGot2Bva$>1-uYPKDz8SkW6v(;U=|xb2^D2F`SugwIbJKZodu?dC7cxqZnv z2bWav)GS}|+U;MPpc=s{arW$<&6+)UCf_VaWKHdg>00~&GYf*>LTN;#-@){VxaZsg zQH_O`rSK8Q_lroErgkS&5w=_=;3uvh7SM1=iyGn0VNGXmnccz6 z`zI!>|BHu|7tPcCT~2o%F+=_Tbn_6+3-lkjGw-M(6!zz(DoWv*yn|N3@w`YcfVsSj zUI;4+Zdwg%(XN0S3NCsPY%4ga1r8J(^kR6nAlz~ZI!{0curi`ZaEpbC< zPm2x27bMk}Qk=+ToUqh@x$IiXpXW*#n6TPbAte+|%A3nW!x7<25-*3um_V<9?PE=} z4hF}Xo%IVuSy2YfGFnU3UZ2-1mn?V!tHFCrqz!NmqpVO<6sQf_ip{hUx{EE;4m;5b zaIn})MHodZ!E8~a4wy&l1fe8S7X(YvCO4Md(8Q(6Wt$b@5nGyh-PV?JAqn$HWrZ!$ zM{KPySh9+1DnK==MEGCAm87u^+>5`+K% delta 1550 zcmZuxYfM{Z82&!AS~s?-K(FT%O3S98XQy2QI1=Z{>A_Z@m($azKm5Uu#+W#wlO;~0 z!Z2#)jE-0TX~JSO@sC4C>18b~1$5q~^EP!unN#N#op-l6eb0qKjcxKJJt&yq4WvjW10tInH$YCIA1X! zER$sA=9sigMSTI%_$u%j7d;5kOrz&DY~1j=PJL1i<`XMZ4z1}0}&+?J3t@$(Bb`tZ)y1}kbpgp&l9)&w|P4pOy z<~GoI$mg2rr!b$hZvG5w!{}R%Dp4`oyIY-6*SLl-3)LVO7W-lkYcUb$ap3X}`Z}TdAH*Wot=Oad+@vvp2jC8C>9&(MKE7< z(Tm}1(Mio>M!CN7^+xpYmpL+ zB)D!P983aJXV$^Kij!UnrKx6m87x*jjh8PGIYD?r4YH+d;(a{NmCd;9I^bs*S`R|W zNgLo6JT0)Jb~ssTp$=G6ZlO-tGRsf~Vr7Q1uoX`i>?*TejcD7_ zq_;9`tB&w$n%%l@YqMb_u3b7o+n0~nJg_)xrCvB)cF-1Z&)MjD;HK@)4OMi^N&oY} myM6@>AnQuFciK){Veg!Sw!!$ct>!8U?y*O9R-UiWfqwy>5b9U} diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index 69fc8c01d14e838b866e9586363c1c8047eb5cc1..e75470730297145b1006c0716718f9c12e681d1a 100644 GIT binary patch delta 26455 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 D7A;sf delta 24423 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 YGyw-f+Lo92?ymk-{fe~h1&Oo%4-MGvC;$Ke diff --git a/BIN/ARP.S.txt b/BIN/ARP.S.txt index 46480e6d..a0b4c704 100644 --- a/BIN/ARP.S.txt +++ b/BIN/ARP.S.txt @@ -64,6 +64,8 @@ CS.RUN >SYSCALL GetArgC >SYSCALL GetArgA >PUSHYA + >DEBUG + >SYSCALL SSCANF bcc CS.RUN.QUERY @@ -72,7 +74,7 @@ CS.RUN >SYSCALL GetArgC rts *-------------------------------------- CS.RUN.QUERY jsr Init.Timeout - + .1 >PUSHW L.DST.MAC >PUSHW L.DST.IP >LIBCALL hLIBTCPIP,LIBTCPIP.ARP.QUERY diff --git a/BIN/PING.S.txt b/BIN/PING.S.txt index ab8df1c4..84abd4db 100644 --- a/BIN/PING.S.txt +++ b/BIN/PING.S.txt @@ -172,11 +172,11 @@ CS.RUN.SEND.ECHO jsr Init.Timeout - >PUSHWI ICMP.RequestLen - >PUSHW L.ICMP.Request - ldy #hSocket >PUSHB (pData),y + >PUSHW L.ICMP.Request + >PUSHWI ICMP.RequestLen + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND bcs CS.RUN.ERR @@ -339,7 +339,6 @@ Socket.Src.Addr .BS 4 Socket.Src.Port .DA 0 Dynamic Socket.Dst.Addr .BS 4 Socket.Dst.Port .DA 0 Identifier - .BS S.SOCKET-16 *-------------------------------------- ICMP.Request .DA #S.ICMP.TYPE.ECHOREQ .DA #0 CODE diff --git a/INC/LIBTCPIP.I.txt b/INC/LIBTCPIP.I.txt index c8406040..2b83c030 100644 --- a/INC/LIBTCPIP.I.txt +++ b/INC/LIBTCPIP.I.txt @@ -171,6 +171,8 @@ S.SOCKET.SRC.ADDR .EQ 4 S.SOCKET.SRC.PORT .EQ 8 S.SOCKET.DST.ADDR .EQ 10 S.SOCKET.DST.PORT .EQ 14 +* +S.SOCKET.TEMPLATE .EQ 16 * Listen type Queue * Raw Type Queue * Datagram type Queue @@ -185,8 +187,8 @@ S.SOCKET.SQ.OUTHEAD .EQ 20 S.SOCKET.SQ.OUTTAIL .EQ 22 S.SOCKET.SQ.INFREE .EQ 24 S.SOCKET.SQ.OUTFREE .EQ 26 -* -* +S.SOCKET.SQ.INUSED .EQ 28 +S.SOCKET.SQ.OUTUSED .EQ 30 S.SOCKET.SQ.SEQNUM .EQ 32 S.SOCKET.SQ.ACKNUM .EQ 36 * diff --git a/LIB/LIBTCPIP.S.FRM.txt b/LIB/LIBTCPIP.S.FRM.txt index a74b5e45..8eacbc3b 100644 --- a/LIB/LIBTCPIP.S.FRM.txt +++ b/LIB/LIBTCPIP.S.FRM.txt @@ -5,25 +5,86 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- -* #FRM.NewA -* ##In: -* A = S.IP.PROTOCOL.??? -* ##Out: -* Y,A = Frame PTR -* X = hMem +* FRM.New +* In: +* Y,A = DataLen +* X = S.IP.PROTOCOL.xxx +* Out: +* Y,A = Frame PTR +* X = hMem *-------------------------------------- -FRM.NewA sta .2+1 - >PUSHWI K.ETH.FRAME.LEN - >PUSHBI S.MEM.F.INIT0 +FRM.NewIP stx .8+1 + >STYA ZPDataOutLen + cpx #S.IP.PROTOCOL.ICMP + bne .1 + lda #S.IP-2 + bra .4 + +.1 cpx #S.IP.PROTOCOL.UDP + bne .2 + lda #S.UDP-2 + bra .4 + +.2 cpx #S.IP.PROTOCOL.TCP + bne * + + lda #S.TCP-2 + bra .4 + +.4 sta .5+1 save Header len for reset later + clc + adc ZPDataOutLen + sta ZPFrameOutLen + pha + + lda #0 + adc ZPDataOutLen+1 + sta ZPFrameOutLen+1 + tax + + pla + adc #2 + tay + txa + adc #0 + + >PUSHYA + >PUSHBI 0 >SYSCALL GetMem bcs .9 stx hFrameOut >STYA ZPFrameOutPtr + lda ZPFrameOutLen + sta (ZPFrameOutPtr) + ldy #1 + lda ZPFrameOutLen+1 + sta (ZPFrameOutPtr),y + + iny + +.5 ldx #$ff Self Modified, header length + + lda #0 + +.6 sta (ZPFrameOutPtr),y + iny + dex + bne .6 + + tya +* clc + adc ZPFrameOutPtr + sta ZPDataOutPtr + + lda #0 + adc ZPFrameOutPtr+1 + sta ZPDataOutPtr+1 + lda DevFlags and #S.DEVSTAT.NET.FLAGS.IPOFFLOAD - bne .1 + bne .7 ldy #S.ETH.ETHERTYPE lda /S.ETH.ETHERTYPE.IP @@ -39,47 +100,41 @@ FRM.NewA sta .2+1 * iny * lda #$0 * sta (ZPFrameOutPtr),y - -* ldy #S.IP.IDENTIFICATION -* sta (ZPFrameOutPtr),y -* inc -* iny -* sta (ZPFrameOutPtr),y -* dec + * ldy #S.IP.FRAGMENT.FLAGS * sta (ZPFrameOutPtr),y * iny * sta (ZPFrameOutPtr),y + + ldy #S.IP.IDENTIFICATION+1 + + lda IP.ID + ldx IP.ID+1 + inc + bne .61 + inx + stx IP.ID+1 + +.61 sta IP.ID + + sta (ZPFrameOutPtr),y + dey + txa + sta (ZPFrameOutPtr),y ldy #S.IP.TTL lda #K.IP.TTL sta (ZPFrameOutPtr),y -.1 ldy #S.IP.PROTOCOL -.2 lda #$ff +.7 ldy #S.IP.PROTOCOL + +.8 lda #$ff sta (ZPFrameOutPtr),y - .9 rts *-------------------------------------- -FRM.SendICMP >PUSHW ZPFrameOutLen - >PUSHWI S.ICMP.TYPE-2 +FRM.SendICMP - ldy #S.ICMP.CHECKSUM - lda #0 - sta (ZPFrameOutPtr),y - iny - sta (ZPFrameOutPtr),y - - jsr IP.ComputeChecksum - - phy - ldy #S.ICMP.CHECKSUM - sta (ZPFrameOutPtr),y - iny - pla - sta (ZPFrameOutPtr),y - bra FRM.SendIP *-------------------------------------- FRM.SendTCP @@ -164,20 +219,25 @@ FRM.SendIP ldx #3 Copy SRC.IP even if IP offload cmp #S.IP.PROTOCOL.TCP bne .3 jsr TCP.ComputeChecksum - bra .4 + bra .5 .3 cmp #S.IP.PROTOCOL.UDP bne .4 jsr UDP.ComputeChecksum + bra .5 -.4 lda DevFlags - and #S.DEVSTAT.NET.FLAGS.ARPOFFLOAD +.4 cmp #S.IP.PROTOCOL.ICMP bne .5 + jsr ICMP.ComputeChecksum + +.5 lda DevFlags + and #S.DEVSTAT.NET.FLAGS.ARPOFFLOAD + bne .6 jsr IP.SetDestMAC bcs FRM.Queue -.5 >LDYA ZPFrameOutPtr +.6 >LDYA ZPFrameOutPtr ldx #DEVMGR.WRITEBLOCK jsr NetDevJmp bcs FRM.Queue diff --git a/LIB/LIBTCPIP.S.ICMP.txt b/LIB/LIBTCPIP.S.ICMP.txt index 7b390f67..6e89ae0a 100644 --- a/LIB/LIBTCPIP.S.ICMP.txt +++ b/LIB/LIBTCPIP.S.ICMP.txt @@ -132,6 +132,26 @@ ICMP.IN.ECHOREP jsr IP.FillTmpSocketSrcDst >SYSCALL FreeMemA rts *-------------------------------------- +ICMP.ComputeChecksum + >PUSHW ZPFrameOutLen + >PUSHWI S.ICMP.TYPE-2 + + ldy #S.ICMP.CHECKSUM + lda #0 + sta (ZPFrameOutPtr),y + iny + sta (ZPFrameOutPtr),y + + jsr IP.ComputeChecksum + + phy + ldy #S.ICMP.CHECKSUM + sta (ZPFrameOutPtr),y + iny + pla + sta (ZPFrameOutPtr),y + rts +*-------------------------------------- MAN SAVE LIB/LIBTCPIP.S.ICMP LOAD LIB/LIBTCPIP.S diff --git a/LIB/LIBTCPIP.S.SKT.txt b/LIB/LIBTCPIP.S.SKT.txt index b488568f..9cea497e 100644 --- a/LIB/LIBTCPIP.S.SKT.txt +++ b/LIB/LIBTCPIP.S.SKT.txt @@ -6,6 +6,7 @@ AUTO 6 .LIST OFF */-------------------------------------- * #SKT.New +* Create a new socket * ##In : * PUSHW = PTR to S.SOCKET template * ##Out : @@ -13,7 +14,6 @@ AUTO 6 * X = hSocket *\-------------------------------------- SKT.New >PULLW ZPTmpPtr1 - ldy #S.SOCKET.SRC.PORT+1 lda (ZPTmpPtr1),y dey @@ -74,7 +74,8 @@ SKT.New >PULLW ZPTmpPtr1 lda TmpOffset Did we found an empty slot ? bmi .9 - ldy #S.SOCKET-1 + ldy #S.SOCKET.TEMPLATE-1 + .7 lda (ZPTmpPtr1),y sta (ZPTmpPtr3),y dey @@ -115,6 +116,17 @@ SKT.New.TCP ldy #S.SOCKET.SQ.INFREE iny lda /K.TCP.WSIZE sta (ZPTmpPtr3),y + + lda #0 + ldy #S.SOCKET.SQ.INUSED + sta (ZPTmpPtr3),y + iny + sta (ZPTmpPtr3),y + + ldy #S.SOCKET.SQ.OUTUSED + sta (ZPTmpPtr3),y + iny + sta (ZPTmpPtr3),y >PUSHW K.TCP.WSIZE >PUSHBI 0 @@ -136,7 +148,14 @@ SKT.New.TCP ldy #S.SOCKET.SQ.INFREE clc .9 rts -*-------------------------------------- +*/-------------------------------------- +* #SKT.AcceptA +* Check for an incoming connection +* ##In : +* A = hListeningSocket +* ##Out : +* A = hSocket +*\-------------------------------------- SKT.AcceptA jsr SKT.GetA.I bcs .9 ldy #S.SOCKET.SO @@ -149,11 +168,14 @@ SKT.AcceptA jsr SKT.GetA.I ldy #S.SOCKET.HQ.TAIL cmp (ZPPtrSKT),y Queue Empty beq .9 CC + pha inc cmp #S.SOCKET.HQ.MAX bne .1 + lda #0 + .1 sta (ZPPtrSKT),y pla clc @@ -166,49 +188,81 @@ SKT.AcceptA jsr SKT.GetA.I .99 lda #ERR.SKT.BAD sec .9 rts -*-------------------------------------- -* SKT.Send -*-------------------------------------- +*/-------------------------------------- +* #SKT.Send (DGRAM,STREAM,RAW) +* Send block of data +* ##In : +* PUSHB = hSocket +* PUSHW = pBuf +* PUSHW = len +* ##Out : +* A = hFrame +*\-------------------------------------- SKT.Send >PULLW ZPDataInLen >PULLW ZPDataInPtr >PULLB hSocket + jsr SKT.GetA.I bcs .9 + and #S.SOCKET.SOCK.MASK cmp #S.SOCKET.SOCK.DGRAM beq SKT.SEND.UDP - + cmp #S.SOCKET.SOCK.STREAM bne .1 - jmp SKT.SEND.TCP + ldy #S.SOCKET.SO + lda (ZPPtrSKT),y + and #S.SOCKET.SO.ACCEPTCONN + bne .99 + jmp SKT.SEND.TCP + .1 cmp #S.SOCKET.SOCK.RAW bne .99 jmp SKT.SEND.RAW -.99 sec +.99 lda #ERR.SKT.BAD + sec .9 rts *-------------------------------------- -SKT.SEND.UDP lda #S.IP.PROTOCOL.UDP - jsr FRM.NewA +SKT.SEND.UDP ldx #S.IP.PROTOCOL.UDP + >LDYA ZPDataInLen + jsr FRM.NewIP bcs .9 - >LDAXI S.UDP-2 - jsr SKT.SetFrameOutLenAX - - >LDAXI S.UDP - jsr SKT.SetDataOutPtrAX - jsr SKT.SetFrameOutDstIP jsr SKT.SetFrameOutPorts - + jsr SKT.CopyDataInToOut jmp FRM.SendUDP .9 rts *-------------------------------------- +SKT.SEND.RAW ldy #S.SOCKET.RAW.PROTO + lda (ZPPtrSKT),y + + tax + >LDYA ZPDataInLen + jsr FRM.NewIP + bcs .9 + + jsr SKT.SetFrameOutDstIP + + jsr SKT.CopyDataInToOut + + ldy #S.SOCKET.RAW.PROTO + lda (ZPPtrSKT),y + cmp #S.IP.PROTOCOL.ICMP + bne .1 + jmp FRM.SendICMP +.1 jmp FRM.SendIP + +.9 sec + rts +*-------------------------------------- SKT.SEND.TCP ldy #S.SOCKET.STATUS lda (ZPPtrSKT),y and #S.SOCKET.STATUS.MASK @@ -328,32 +382,6 @@ SKT.SEND.TCP ldy #S.SOCKET.STATUS .91 lda #MLI.ERR.VOLFULL sec rts -*-------------------------------------- -SKT.SEND.RAW ldy #S.SOCKET.RAW.PROTO - lda (ZPPtrSKT),y - - jsr FRM.NewA - bcs .9 - - >LDAXI S.IP-2 - jsr SKT.SetFrameOutLenAX - - >LDAXI S.IP - jsr SKT.SetDataOutPtrAX - - jsr SKT.SetFrameOutDstIP - - jsr SKT.CopyDataInToOut - - ldy #S.SOCKET.RAW.PROTO - lda (ZPPtrSKT),y - cmp #S.IP.PROTOCOL.ICMP - bne .1 - jmp FRM.SendICMP -.1 jmp FRM.SendIP - -.9 sec - rts */-------------------------------------- * #SKT.RcvdA (DGRAM,RAW) * ##In : @@ -554,8 +582,14 @@ SKT.Rcvd.1 jsr SKT.GetCopy .90 lda #0 .9 sec A=0, no data rts -*-------------------------------------- -SKT.CLOSEA cmp #K.SKTTABLE.SIZE +*/-------------------------------------- +* #SKT.CloseA +* Close socket +* ##In : +* A = hSocket +* ##Out : +*\-------------------------------------- +SKT.CloseA cmp #K.SKTTABLE.SIZE bcs SKT.GetA.9 jsr SKT.GetA.I @@ -579,7 +613,14 @@ SKT.CLOSEA cmp #K.SKTTABLE.SIZE sta (ZPPtrSKT) clc .9 rts -*-------------------------------------- +*/-------------------------------------- +* #SKT.GetA +* Get Ptr to socket +* ##In : +* A = hSocket +* ##Out : +* Y,A = pS.SOCKET +*\-------------------------------------- SKT.GetA cmp #K.SKTTABLE.SIZE bcs SKT.GetA.9 @@ -609,14 +650,26 @@ SKT.GetA.I pha .2 dex bne .1 - lda (ZPPtrSKT) +.8 lda (ZPPtrSKT) beq SKT.GetA.9 -.8 rts CC + clc + rts SKT.GetA.9 lda #ERR.SKT.BAD sec rts +*/-------------------------------------- +* #SKT.GetTable +* Get socket table +* ##In : +* ##Out : +* Y,A = pS.SOCKET +*\-------------------------------------- +SKT.GetTable lda hSocketTable + >SYSCALL GetMemPtrA + clc + rts *-------------------------------------- * ZPPtrSKT -> actual socket * A = hSocket or hFrame @@ -648,11 +701,6 @@ SKT.AddToQueueA sta .2+1 .9 sec rts *-------------------------------------- -SKT.GETTABLE lda hSocketTable - >SYSCALL GetMemPtrA - clc - rts -*-------------------------------------- SKT.AddToQueueS clc rts @@ -674,28 +722,6 @@ SKT.PutCopy ldy #S.SOCKET-1 bpl .1 rts *-------------------------------------- -SKT.SetFrameOutLenAX - clc - adc ZPDataInLen - sta (ZPFrameOutPtr) - sta ZPFrameOutLen - - txa - adc ZPDataInLen+1 - ldy #1 - sta (ZPFrameOutPtr),y - sta ZPFrameOutLen+1 - rts -*-------------------------------------- -SKT.SetDataOutPtrAX - clc - adc ZPFrameOutPtr - sta ZPDataOutPtr - txa - adc ZPFrameOutPtr+1 - sta ZPDataOutPtr+1 - rts -*-------------------------------------- SKT.SetFrameOutDstIP ldy #S.SOCKET.DST.ADDR ldx #4 @@ -738,21 +764,29 @@ SKT.SetFrameOutPorts iny txa sta (ZPFrameOutPtr),y + rts *-------------------------------------- SKT.CopyDataInToOut + lda ZPDataInPtr+1 + pha + lda ZPDataOutPtr+1 + pha + lda ZPDataInLen eor #$ff - sta ZPDataInLen + tax lda ZPDataInLen+1 eor #$ff - tax + pha ldy #0 -.1 inc ZPDataInLen +.1 inx bne .2 - inx + pla + inc beq .9 + pha .2 lda (ZPDataInPtr),y sta (ZPDataOutPtr),y @@ -761,8 +795,13 @@ SKT.CopyDataInToOut inc ZPDataInPtr+1 inc ZPDataOutPtr+1 bne .1 -.9 rts - + +.9 pla + sta ZPDataOutPtr+1 + pla + sta ZPDataInPtr+1 + rts +*-------------------------------------- MAN SAVE LIB/LIBTCPIP.S.SKT LOAD LIB/LIBTCPIP.S diff --git a/LIB/LIBTCPIP.S.TCP.txt b/LIB/LIBTCPIP.S.TCP.txt index db868571..6da32ac7 100644 --- a/LIB/LIBTCPIP.S.TCP.txt +++ b/LIB/LIBTCPIP.S.TCP.txt @@ -223,6 +223,29 @@ TCP.IN.JMP.TIMEWT clc rts *-------------------------------------- +TCP.OUT jsr SKT.GetCopy + + lda SKT.TmpCache+S.SOCKET.SQ.OUTUSED+1 + bne .1 + ldy SKT.TmpCache+S.SOCKET.SQ.OUTUSED + beq .8 nothing to send....go check if ACK pending + +.1 cpy #K.TCP.MSS + pha + sbc /K.TCP.MSS OUTDATA > MSS ? + pla + bcs .2 no....get data len + + >LDYAI K.TCP.MSS yes gert only MSS + +.2 >STYA ZPDataOutLen + + + jmp FRM.SendTCP + +.8 clc + rts +*-------------------------------------- TCP.UpdateSktAckNum ldy #S.SOCKET.SQ.ACKNUM+3 lda (ZPPtrSKT),y diff --git a/LIB/LIBTCPIP.S.txt b/LIB/LIBTCPIP.S.txt index 65804c4d..599f23ca 100644 --- a/LIB/LIBTCPIP.S.txt +++ b/LIB/LIBTCPIP.S.txt @@ -123,9 +123,6 @@ LIB.LOAD lda bFirstLoad jsr ARP.CLEAR jsr DNS.CLEAR - >LDYAI K.DYNPORT.START - >STYA DYNPORT.LAST - >PUSHWI K.SKTTABLE.SIZE*S.SOCKET >PUSHBI S.MEM.F.INIT0 >SYSCALL GetMem @@ -138,7 +135,12 @@ LIB.LOAD lda bFirstLoad .8 clc .9 rts *-------------------------------------- -LIB.UNLOAD clc +LIB.UNLOAD lda hSocketTable + beq .8 + + >SYSCALL FreeMemA + +.8 clc rts *-------------------------------------- POLL ldx #DEVMGR.READBLOCK @@ -294,7 +296,6 @@ DNS.SOCKET.SA .BS 4 DNS.SOCKET.SP .DA 0 Dynamic DNS.SOCKET.DA .BS 4 DNS.SOCKET.DP .DA UDP.PORT.DNS - .BS S.SOCKET-16 *-------------------------------------- DNS.MSG.LEN .BS 2 DNS.MSG @@ -317,7 +318,7 @@ FRM.QUEUE.Retry .BS K.FRMQUEUE.SIZE bFirstLoad .DA #0 hSocketTable .BS 1 DevFlags .BS 1 -DYNPORT.LAST .BS 2 +DYNPORT.LAST .DA K.DYNPORT.START hDNSSocket1 .BS 1 hDNSSocket2 .BS 1 DNS.HostNameLen .BS 1 @@ -333,6 +334,7 @@ hSocket .BS 1 TmpOffset .BS 2 HST.DecStr .BS 4 HST.IP .BS 5 +IP.ID .BS 2 IP.CHECKSUM .BS 4 *-------------------------------------- MAN diff --git a/SBIN/DHCPCLNT.S.txt b/SBIN/DHCPCLNT.S.txt index afe0ea84..833a7484 100644 --- a/SBIN/DHCPCLNT.S.txt +++ b/SBIN/DHCPCLNT.S.txt @@ -106,7 +106,6 @@ CS.INIT >LDYA L.LIBTCPIP CS.RUN >PUSHW L.Socket >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.NEW - bcc .1 jmp CS.RUN.KO @@ -119,10 +118,11 @@ CS.RUN >PUSHW L.Socket jsr Init.Timeout -CS.RUN.SDISC >PUSHWI DHCP.DISC.LEN +CS.RUN.SDISC ldy #hSocket + >PUSHB (pData),y >PUSHW L.DHCP.DISC - jsr CS.RUN.SKT.SEND - + >PUSHWI DHCP.DISC.LEN + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND bcc .1 jmp CS.RUN.KO @@ -155,9 +155,11 @@ CS.RUN.SREQ ldx #3 >LDYA L.MSG.CFG2 >SYSCALL CPrintFYA - >PUSHWI DHCP.REQ.LEN + ldy #hSocket + >PUSHB (pData),y >PUSHW L.DHCP.REQ - jsr CS.RUN.SKT.SEND + >PUSHWI DHCP.REQ.LEN + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND bcs CS.RUN.KO lda #S.IPCFG.STATUS.SREQ @@ -207,11 +209,6 @@ CS.RUN.KO pha sec rts *-------------------------------------- -CS.RUN.SKT.SEND ldy #hSocket - >PUSHB (pData),y - >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND - rts -*-------------------------------------- CS.RUN.SKT.RCVD ldy #hSocket lda (pData),y >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.RCVDA @@ -243,7 +240,7 @@ CS.DOEVENT lda (pEvent) CS.QUIT ldy #hSocket lda (pData),y -* >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA + >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA lda hLIBTCPIP >SYSCALL UnloadLibA @@ -449,7 +446,6 @@ Socket .DA #S.SOCKET.SOCK.DGRAM .DA UDP.PORT.DHCPC Socket.Src.Port .HS FF.FF.FF.FF Socket.Dst.Addr .DA UDP.PORT.DHCPS Socket.Dst.Port - .BS S.SOCKET-16 *-------------------------------------- DHCP.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS DHCP.DISC.XID .BS 4 diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 66e093fc..57695aae 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -12,6 +12,7 @@ AUTO 6 .INB /A2OSX.DEV/INC/A2OSX.I .INB /A2OSX.DEV/INC/IO.I .INB /A2OSX.DEV/INC/PRODOS.I + .INB /A2OSX.DEV/INC/MLI.ERR.I *-------------------------------------- TmpPtr1 .EQ $0 for X.PRINTF.S ZPPtr1 .EQ ZPKERNEL Temp Ptrs for use in very limited scope diff --git a/_Docs/LIBTCPIP.md b/_Docs/LIBTCPIP.md index 30798d6d..8a02c6fe 100644 --- a/_Docs/LIBTCPIP.md +++ b/_Docs/LIBTCPIP.md @@ -1,15 +1,7 @@ *** Auto generated by docgen.cmd *** -#FRM.NewA - -##In: -+ A = S.IP.PROTOCOL.??? - -##Out: -* Y,A = Frame PTR -* X = hMem - #SKT.New ++ Create a new socket ##In : + PUSHW = PTR to S.SOCKET template @@ -17,3 +9,87 @@ ##Out : + YA = PTR to new S.SOCKET + X = hSocket + +#SKT.AcceptA ++ Check for an incoming connection + +##In : ++ A = hListeningSocket + +##Out : ++ A = hSocket + +#SKT.Send (DGRAM,STREAM,RAW) ++ Send block of data + +##In : ++ PUSHB = hSocket ++ PUSHW = pBuf ++ PUSHW = len + +##Out : ++ A = hFrame + +#SKT.RcvdA (DGRAM,RAW) + +##In : ++ A = hSocket + +##Out : ++ A = hFrame + +#SKT.GetCA (STREAM) ++ Read a Char From Stream in A + +##In : ++ A = hSocket + +##Out : ++ A = char + +#SKT.GetS (STREAM) ++ Read a CR terminated Line in pBuf + +##In : ++ PUSHB = hSocket ++ PUSHW = pBuf ++ PUSHW = len + +##Out : ++ Y,A = bytes read + +#SKT.Rcvd (STREAM) ++ Read data in pBuf + +##In : ++ PUSHB = hSocket ++ PUSHW = pBuf ++ PUSHW = len + +##Out : ++ Y,A = bytes transfered + +#SKT.CloseA ++ Close socket + +##In : ++ A = hSocket + +##Out : + +#SKT.GetA ++ Get Ptr to socket + +##In : ++ A = hSocket + +##Out : ++ Y,A = pS.SOCKET + +#SKT.GetTable ++ Get socket table + +##In : + +##Out : ++ Y,A = pS.SOCKET